"Atau" setara dalam ekspresi lambda Linq Where ()


91

Apakah ada metode di Linq di mana Anda dapat menggunakan untuk membangun string SQL seperti "... where (a = 1) OR (a = 2)"?


4
Saya berasumsi Anda tahu cara menggunakan ||dan menginginkan sesuatu yang dinamis, seperti a=a.where(hour=> hour<20); if(weekend) a=a.where(hour=> hour>6);. Anda mungkin ingin menyatakan itu lebih jelas ...
Kobi

Jawaban:


189

Anda pasti bisa melakukannya dalam klausa Where (metode ekstensi). Jika Anda perlu membuat kueri kompleks secara dinamis, Anda dapat menggunakan PredicateBuilder .

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

Atau menggunakan 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 );

Ini bekerja dengan baik karena saya perlu membangun Or saya, tergantung pada nilai parameter yang masuk - Luar biasa!
Tandai

Sangat keren. Sayang sekali ini tidak dimasukkan sebagai fungsi di dalam .NET sebagai standar.
maks.

1
Implementasi yang sangat bagus, meskipun mungkin tidak dicatat, ini hanya berfungsi untuk C # 5+.
Thomas Donnelly

25

Anda dapat menggunakan operator boolean .NET standar di klausa tempat tunggal Anda:

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

19

Anda menggunakan semua operator yang sama seperti pada C # ===> || untuk "atau" && untuk "dan" dll.

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

1

dalam .Where()panggilan Anda, gunakan operator Boolean 'Or' standar ||,.

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

Semua panggilan Where do adalah perbandingan Boolean pada apa pun yang Anda inginkan, sehingga Anda dapat mengisinya dengan logika kondisional sebanyak yang Anda inginkan.


0

Jika Anda tidak mengetahui jumlah parameter, Anda dapat menggunakan ini:

Contoh data

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";

Kode

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

Ini dibangun ke dalam .net sekarang, tidak yakin apakah sebelumnya tidak. Dengan kueri Linq yang sudah ada, Anda bisa menambahkan klausa where yang mengambil larik string (SearchStrings), dan memeriksa apakah ada yang cocok dengan objek apa pun dalam koleksi yang Anda cari. Menggunakan ToLower () hanya memastikan bahwa Anda menghindari sensitivitas huruf besar-kecil dalam kueri SQL.

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

Anda dapat melakukan hal yang sama untuk predikat 'dan' dengan mencocokkan semua kata dalam larik dengan objek collection.

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

Dalam contoh ini saya berkorelasi dengan setiap objek dalam koleksi, dan berkorelasi dengan setiap string dalam array SearchStrings.


1
Perhatikan bahwa 'Any' tidak dapat diterjemahkan oleh penyedia EF dan akan dievaluasi secara lokal sehingga menghasilkan pemindaian tabel lengkap dan pemfilteran dalam memori.
Wade Bee
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.