“Hoặc” tương đương trong biểu thức Linq Where () lambda


91

Có phương thức nào trong Linq mà bạn có thể sử dụng để xây dựng các chuỗi SQL như "... where (a = 1) OR (a = 2)" không?


4
Tôi cho rằng bạn biết cách sử dụng ||và muốn một cái gì đó năng động, như a=a.where(hour=> hour<20); if(weekend) a=a.where(hour=> hour>6);. Bạn có thể muốn nhà nước rõ ràng hơn ...
Kobi

Câu trả lời:


189

Bạn chắc chắn có thể làm điều đó trong mệnh đề Where (phương thức mở rộng). Tuy nhiên, nếu bạn cần tạo một truy vấn phức tạp động, bạn có thể sử dụng PredicateBuilder .

 var query = collection.Where( c => c.A == 1 || c.B == 2 );

Hoặc sử dụng PredicateBuilder

 var predicate = PredicateBuilder.False<Foo>();
 predicate = predicate.Or( f => f.A == 1 );
 if (allowB)
 {
    predicate = predicate.Or( f => f.B == 1 );
 }

 var query = collection.Where( predicate );

Điều này hoạt động hiệu quả khi tôi cần để xây dựng Hoặc tùy thuộc vào giá trị của các tham số đến - Tuyệt vời!
Đánh dấu

Rất tuyệt. Thật tiếc là nó không được bao gồm như một chức năng bên trong .NET theo tiêu chuẩn.
maxp

1
Việc triển khai rất tốt, mặc dù có thể không được lưu ý rằng điều này chỉ hoạt động cho C # 5+.
Thomas.Donnelly

25

Bạn có thể sử dụng toán tử boolean .NET tiêu chuẩn trong mệnh đề where:

MyDataSource.Where(data => data.a == 'a' || data.a == 'b')

19

Bạn sử dụng tất cả các toán tử giống như trong C # bình thường ===> || cho "hoặc" && cho "và" v.v.

var something = from s in mycollection
                where s.something == 32 || 
                      s.somethingelse == 45 
                select s

1

trong .Where()cuộc gọi của bạn, hãy sử dụng toán tử Boolean 'Or' tiêu chuẩn ||,.

var query = items.Where(item => (item == 1 || item == 2));

Tất cả lệnh gọi Where là so sánh Boolean trên bất kỳ thứ gì bạn muốn, vì vậy bạn có thể điền vào nó với nhiều logic có điều kiện tùy thích.


0

Nếu bạn không biết số lượng tham số, bạn có thể sử dụng cái này:

Dữ liệu mẫu

var parameters= new List<string>{"a","d"};
var sampledata = new Dictionary<string,string>();
    sampledata["a"] = "A";
    sampledata["b"] = "B";
    sampledata["c"] = "C";
    sampledata["d"] = "D";

var query = sampledata.AsQueryable();
var firstItemKey = sampledata.FirstOrDefault().Key;
var queryresult= sampledata.Where(x => x.Key == firstItemKey).AsQueryable();
foreach (var parameter in parameters.Skip(1))
{
    queryresult=queryresult.Concat(query.Where(x => x.Key == parameter));
}
var result = queryresult.ToList();

-1

Điều này đã được tích hợp vào .net ngay bây giờ, không chắc chắn nếu trước đây không. Với một truy vấn Linq hiện có, bạn có thể thêm mệnh đề where lấy một mảng chuỗi (Chuỗi tìm kiếm) và kiểm tra xem có bất kỳ chuỗi nào trong số đó khớp với bất kỳ đối tượng nào trong tập hợp bạn đang tìm kiếm hay không. Sử dụng ToLower () chỉ đảm bảo rằng bạn tránh phân biệt chữ hoa chữ thường trong các truy vấn SQL.

query.Where(i => SearchStrings.Any(s => i.ToLower().Contains(s.ToLower()));

Bạn có thể làm điều tương tự đối với vị từ 'và' bằng cách khớp tất cả các từ trong mảng với đối tượng của bộ sưu tập.

query.Where(i => SearchStrings.All(s => i.ToLower().Contains(s.ToLower()));

Trong ví dụ này, tôi tương quan với từng đối tượng trong một tập hợp và tương quan với từng chuỗi trong mảng Chuỗi tìm kiếm.


1
Lưu ý rằng nhà cung cấp EF không thể dịch 'Bất kỳ' và sẽ được đánh giá cục bộ dẫn đến quét toàn bộ bảng và lọc trong bộ nhớ.
Wade Bee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.