2010-11-17 3 views
6

Có thể bao gồm một mệnh đề ở nơi (LINQ) nhưng chỉ khi không có "KHÔNG"?Chỉ sử dụng biến trong mệnh đề where nếu NOT trống? Một loại mệnh đề động ở đâu?

tức

where c.Code == sCode && p.Code == code 

Trong trường hợp này biến (tiêu chuẩn C#) được gọi là mã ... nếu nó không có sản phẩm nào thì trên, nơi là rất tốt .. nhưng nếu nó có sản phẩm nào sau đó tôi không muốn bao gồm trong nó trở thành nơi

tức

where c.Code == sCode 

trong SQL thực hiện nó như thế này

 AND ((@code = '') 
        OR (@code <> '' 
         AND C.Code = @code 
        ) 

Trả lời

10
where c.Code == sCode && (string.IsNullOrEmpty(code) || p.Code == code) 

Đó là cho tiêu chuẩn LINQ, tôi không có ý tưởng nếu nó hoạt động cho LINQ đến SQL.

Edit: này hoạt động thông qua short circuit evaluation

nếu c.Code == sCode là sai, nó dừng lại đánh giá và trả về false
cách khác, nếu string.IsNullOrEmpty(code) là đúng, nó dừng lại đánh giá và trả về true
khác, trở p.Code == code

+0

bạn đã có! cách sai lầm aroun ..... oh chờ đợi bạn thay đổi nó. :) – RPM1984

+2

(chỉnh sửa ẩn) = D – Greg

+0

Phong cách ninja Hahah, phải yêu cách "chỉnh sửa" không hiển thị trừ khi sau 5 phút hoặc trả lời câu hỏi. – RPM1984

4

Đặt rằng trong một phương pháp IQueryable<T> mở rộng để giữ cho nó thực sự đơn giản:

public static IQueryable<Code> WithCodeIfNotEmpty(this IQueryable<Code> source, string code) 
{ 
    if (string.IsNullOrEmpty(code)) 
     return source; 
    else 
     return source.Where(x => x.Code == code); 
} 

Cách sử dụng:

var query = something.WithCodeIfNotEmpty("someCode"); 
3

Như đã nêu khác:

(string.IsNullOrEmpty(code) || p.Code == code) 

btw sql có thể được tối ưu hóa để

C.Code = isnull(ltrim(rtrim(@code)), c.Code) 
+0

Thanks Preet .. Đây là giải pháp rất tốt và đơn giản cho vấn đề tôi đang phải đối mặt. Tôi hỏi một bài viết bản thân mình và mọi người chỉ trả lời DLinq và phương pháp ext .. tất cả tôi muốn là giải pháp của bạn .. – lawphotog

0

Nếu bạn muốn có một hình thức dịch trực tiếp mà TSQL bạn đưa thì đây là câu trả lời

where 
    code == "" || 
    (code != "" && 
    c.Code == code)