2017-01-31 14 views
20

Có cách nào để kết hợp các truy vấn trong các phần ifelse không?Các biến vị ngữ có điều kiện trong LINQ?

public List<MyClass> GetData(Category category, bool flag= true) 
{ 
    IQueryable<MyClass> result; 
    if (flag) 
    { 
     result = Session.All<MyClass>() 
        .Where(mc => mc.Col.Equals(category.ToString()) && mc.FLAG); 
    } 
    else 
    { 
     result = Session.All<MyClass>() 
        .Where(mc => mc.Col.Equals(category.ToString())); 
    } 

    return result.ToList(); 
} 

Trả lời

25

Chắc chắn.

result = Session.All<MyClass>() 
       .Where(mc => mc.Col.Equals(category.ToString()) && (!flag || mc.FLAG)); 

Bạn có thể xác định logic viết lại bằng cách làm cho một ma trận của phép true kết quả:

▼ mc.FLAG ► flag 
      true  false 
true  valid valid 
false  invalid valid 

Ở đây bạn thấy rằng tình trạng này là hợp lệ nếu flag là sai (cả hai tương đương với true) hoặc mc.FLAGtrue.

Tôi cũng sẽ tư vấn để kiểm tra cờ trước, vì đó là vị từ hoạt động tốt hơn. Điều này có thể ngăn kiểm tra thứ hai nếu kết quả đầu tiên là false:

result = Session.All<MyClass>() 
       .Where(mc => (!flag || mc.FLAG) && mc.Col.Equals(category.ToString()); 
+0

Đó là gọn gàng. Cảm ơn! – devnull

+1

@devnull Bạn được chào đón. Bao gồm logic cho điều này ngay bây giờ. Đã có một chút rắc rối với việc tìm kiếm các ký tự unicode phù hợp :) –

+1

Tôi biết điều này trả lời câu hỏi. Chỉ cần tò mò, bạn có thích điều này để mã trong OP xem xét khả năng đọc và (cận) hiệu suất? – Jimmy

21

Bạn có thể chuỗi Where có điều kiện.

public List<MyClass> GetData(Category category, bool flag = true) 
{ 
    var result = Session.All<MyClass>() 
     .Where(mc => mc.Col.Equals(category.ToString())); 

    if (flag) { 
     result = result.Where(mc => mc.FLAG); 
    } 

    return result.ToList(); 
} 
Các vấn đề liên quan