Tôi có thể sử dụng nếu mệnh đề với LINQ ở đâu không?Nếu điều kiện trong LINQ Where khoản
Trả lời
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();
Vì 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.
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);
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
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ù.
bạn có thể thử điều này như thế nào? –
Có, ít nhất nó hoạt động với LINQ-to-đối tượng. –
Bằng với: list.Where (item => Foo (mục)); –
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.
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);
var query = someList.Where(a => (someCondition)? a == "something" : true);
như vậy, nếu 'someCondition' là sai, 'ở đâu' sẽ bị bỏ qua.
Điều này thực sự phải là câu trả lời được chấp nhận –
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));
...
+1 câu trả lời xuất sắc nhất trong số ba. –
Ở đâu không sản xuất IQueryable, nó đang tạo ra IEnumerable. Câu trả lời sai –
@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. –