"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)"?

dstr
sumber
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 );
tvanfosson.dll
sumber
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')
Simon Steele
sumber
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
Muad'Dib
sumber
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.

Alastair Pitts
sumber
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();
Bora Aydın
sumber
-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.

JMacor
sumber
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