Linq Where () lambda ifadesinde "veya" eşdeğeri


91

Linq'te "... burada (a = 1) OR (a = 2)" gibi SQL dizeleri oluşturmak için kullanabileceğiniz bir yöntem var mı?


4
||Dinamik bir şeyi nasıl kullanacağını ve istediğini bildiğini varsayıyorum a=a.where(hour=> hour<20); if(weekend) a=a.where(hour=> hour>6);. Bunu daha açık bir şekilde belirtmek isteyebilirsiniz ...
Kobi

Yanıtlar:


189

Bunu kesinlikle bir Where cümlesi (uzatma yöntemi) içinde yapabilirsiniz. Dinamik olarak karmaşık bir sorgu oluşturmanız gerekiyorsa, bir PredicateBuilder kullanabilirsiniz .

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

Veya bir PredicateBuilder kullanarak

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

Bu, gelen parametrelerin değerlerine bağlı olarak Or'umu oluşturmam gerektiği için harika çalıştı - Harika!
Mark

Çok havalı. Bunun .NET'in içinde bir işlev olarak standart olarak dahil edilmemesi çok yazık.
maxp

1
Çok güzel bir uygulama, ancak bunun yalnızca C # 5+ için çalıştığı belirtilmemiş olabilir.
Thomas.Donnelly

25

Standart .NET boole işleçlerini tek where cümlenizde kullanabilirsiniz:

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

19

Normal C # ===> || ile aynı operatörleri kullanıyorsunuz. "veya" && "ve" vb. için

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

1

sizin de .Where()çağrı standart Boole 'Ya' operatörünü kullanın ||.

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

Where çağrısının yaptığı tek şey, istediğiniz herhangi bir şeyin Boolean karşılaştırmasıdır, böylece istediğiniz kadar koşullu mantıkla doldurabilirsiniz.


0

Parametre sayısını bilmiyorsanız, bunu kullanabilirsiniz:

Örnek veri

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

Kod

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

Bu şimdi .net içine yerleştirilmiştir, daha önce olmadığından emin değilim. Mevcut bir Linq sorgusu verildiğinde, bir dizi dizeyi (SearchStrings) alan bir where cümlesi ekleyebilir ve aradığınız koleksiyondaki herhangi bir nesneyle eşleşip eşleşmediğini kontrol edebilirsiniz. ToLower () kullanmak sadece 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()));

Bir 've' yüklemi için aynı şeyi, dizideki tüm kelimeleri koleksiyonun nesnesiyle eşleştirerek yapabilirsiniz.

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

Bu örnekte, bir koleksiyondaki her bir nesneyle ilişkilendiririm ve s SearchStrings dizisindeki her dizeyle ilişkilendirir.


1
'Herhangi biri'nin bir EF sağlayıcısı tarafından çevrilemeyeceğini ve yerel olarak değerlendirileceğini ve tam bir tablo taraması ve bellek içi filtreleme ile sonuçlanacağını unutmayın.
Wade Bee
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.