2010-01-20 26 views
73

Linq'de "... (a = 1) OR (a = 2)" gibi SQL dizelerini oluşturmak için kullanabileceğiniz bir yöntem var mı?"Veya" eşdeğeri Linq Where() lambda ifadesi

+3

"||" işlevini nasıl kullanacağınızı ve dinamik bir şey istediğinizi (örneğin, a = a.where (saat => saat <20)); eğer (haftasonu) a = a.where (saat => saat> 6); '. Bunu daha açık bir şekilde belirtmek isteyebilirsiniz ... – Kobi

cevap

154

Bir Nereye maddesi (uzatma yöntemiyle) içinde bunu kesinlikle yapabilirsiniz. Bununla birlikte, karmaşık bir sorguyu dinamik olarak oluşturmanız gerekiyorsa, bir PredicateBuilder kullanabilirsiniz.

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

Veya .Where() çağrısında bir 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); 
+0

Yükleyicilerin Nice kullanımı! +1 :) –

+0

Bu, gelen parametrelerin değerlerine bağlı olarak ya da onu inşa etmek için gerekli olan harika çalıştı - Awesome! – dadwithkids

+0

Çok havalı. Bu utanç verici bir standart olarak .NET içinde bir işlev olarak dahil değildir. – maxp

20

fıkra nerede Eğer tek standart .NET bağlaçlar kullanabilirsiniz:

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

Bence bu en iyi ve en basit cevaptır. – user1477388

+1

Bu en basit cevaptır. – Eranda

16

Hepiniz aynısınız kullanmak operatörler normal C# ===> || için "veya" & & için "ve" vb

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

Bu yöntemi tercih ediyorum, daha doğal görünüyor – nXqd

1

kullanılarak ||, standart Boole 'Ya' operatörünü kullanın. istediğiniz gibi kadar şartlı mantığı ile doldurmak böylece

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

Tüm Nerede çağrı yapar, istediğiniz herhangi bir şey üzerinde bir Boole fark var.

0

Bu şimdi .net içine yerleştirilmiş, daha önce olmadığından emin değil. Mevcut bir Linq sorgusu verildiğinde, bir dizi dizeyi (SearchStrings) alan bir where cümlesi ekleyebilir ve bunlardan herhangi birinin, aradığınız koleksiyondaki herhangi bir nesne ile eşleşip eşleşmediğini kontrol edebilirsiniz. ToLower() işlevini kullanmak, SQL sorgularında büyük/küçük harf duyarlılığından kaçınmanızı sağlar.

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

Sen koleksiyonunun nesneye dizideki tüm kelimeleri eşleştirerek Bir 've' yüklemi için aynı şeyi yapabilir.

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

Bu örnekte i koleksiyonunda her nesneye ilişkilidir ve s Searchstrings dizisindeki her bir dize karşı gelir.