2010-09-10 55 views

Trả lời

33

Có bạn có thể thích:

var query = someList.Where(a => a == "something"); 
if (condition) 
{ 
    query = query.Where(b => b == "something else"); 
} 
var result = query.ToList(); 

Where được sản xuất một IQueryable, việc thực hiện được hoãn lại cho đến khi ToList trong ví dụ của tôi để bạn có thể chuỗi Where s với nhau như nhiều như bạn muốn và sau đó chỉ cần thực hiện nó sau khi bạn đã vượt qua tất cả các điều kiện của bạn.

+2

+1 câu trả lời xuất sắc nhất trong số ba. –

+0

Ở đâu không sản xuất IQueryable, nó đang tạo ra IEnumerable. Câu trả lời sai –

+0

@OmerK Sản phẩm trong thực tế IQueryable, nếu đối tượng bạn đang chạy phương pháp mở rộng cũng là một IQueryable, nếu bạn chạy nó trên một IEnumerable, bạn sẽ nhận được một IEnumerable. –

5

Make sử dụng WhereIf extenstion phương pháp avaialbe trong LINQ

Ví dụ

if (SearchControlMain.PostingID.HasValue) 
    query = query.Where(q => q.PostingID == SearchControlMain.PostingID); 

thay vì ở trên đi cho dưới đây

query = query.WhereIf(SearchControlMain.CategoryID.HasValue, q => q.CategoryID == SearchControlMain.CategoryID); 

LINQ WhereIf Extension Method

LINQ to SQL Where Clause Optional Criteria

+1

Một trong các liên kết đã chết và không có điều gì như 'WhereIf' trong EF của tôi. – A1rPun

0

Tôi không chắc chắn những gì câu hỏi là, nhưng một câu trả lời có thể là:

Vâng,

list.Where(item => { if (Foo(item)) return true; else return false; }); 

Nó sẽ là một cách phức tạp để nói một cái gì đó đơn giản, mặc dù.

+0

bạn có thể thử điều này như thế nào? –

+1

Có, ít nhất nó hoạt động với LINQ-to-đối tượng. –

+0

Bằng với: list.Where (item => Foo (mục)); –

4

Không chắc nếu điều này là phù hợp nhưng nó là khá hữu ích, bạn có thể sử dụng IFS khá thuận lợi vẻ vang với điều kiện nơi mệnh đề:

var r = (from p in productinfo.tblproduct 
        where p.Accountid == accountid 
        select p); 

      if (uuf1 != null) 
       r = r.Where(p => p.UnitUserField1 == uuf1); 

      if (uuf2!= null) 
       r = r.Where(p => p.UnitUserField2 == uuf2); 

Vì vậy mệnh đề where sẽ được sửa đổi theo những gì có trong UUF1 hoặc UUF2 tức bạn có thể chỉ có UUF1 với thông tin, trong trường hợp nó sẽ lấy điều đó và bỏ qua mệnh đề UUF2 where, bạn có thể có cả hai trong đó nó sẽ lấy cả hai hoặc bạn có thể không có bất kỳ thứ gì trong UUF1 hoặc 2 và mệnh đề where của bạn sẽ lấy accountid như mệnh đề where.

2

Tôi đã có một kịch bản như thế này, nơi tôi đã phải kiểm tra null trong danh sách chính nó. Đây là những gì tôi đã làm.

items = from p in items 
     where p.property1 != null //Add other if conditions 
     select p; 

// Use items the way you would use inside the if condition 

Nhưng khi Kelsey đã chỉ ra điều này sẽ làm việc quá -

items = items.Where(a => a.property1 != null); 
14
var query = someList.Where(a => (someCondition)? a == "something" : true); 

như vậy, nếu 'someCondition' là sai, 'ở đâu' sẽ bị bỏ qua.

+0

Điều này thực sự phải là câu trả lời được chấp nhận –

1

Trong trường hợp của tôi có hai "có điều kiện", nơi phụ thuộc vào phím tìm kiếm, vì vậy tôi đã làm:

var query = db.Package.Include("SomeThing") 
    .Where(item => searchString1 == null || searchString1 == "" || item.Contains(searchString1)) 
    .Where(item => searchString2 == null || searchString2 == "" || item.Contains(searchString2)); 
    ... 
Các vấn đề liên quan