2016-03-23 16 views
1

Değişken miktarda OR cümlesi içeren LINQ kullanarak bir SQL sorgusu oluşturmam gereken bir senaryo var. Bazı girdilere dayanarak sorguyu oluşturacak bir işlev yazıyorum. Fonksiyon tanımı Ben gerçek için kontrol edilmesi gereken sütunların bir koleksiyon verilen ediyorum, So ...LINQ ile birlikte, OR cümleleri nasıl zincirlenir?

function BuildQuery(ICollection<ColumnsThatNeedToBeTrue> columns) 
{ 
    ... 
} 

benzer bir şey görünüyor ve çek OR cümleleri kullanması gerekir. columns dizi A ve B içeriyorsa

, ben sütun A doğrudur YA kolon B doğruysa kontrol etmek sorguyu gerekiyordu. columns dizisi A, B ve C içeriyorsa

, ben sorgulamak ve A VEYA B YA C doğruysa kontrol etmek gerekiyordu.

Tek bir Where içinde bunu nasıl yapacağımı bilmiyorum, çünkü ek olarak || ek maddelerine ek olarak ilerlemenin bir yolunu bilmiyorum. Giriş dizisine bağlı olarak, aşağıda nasıl ek OR kontrolleri ekleyeceğimi bilmiyorum. o AND maddeleri kullanarak bu sorguyu oluşturur ve çünkü

var query = entities.Where(m => m.A == true || m.B == true ...) 

Ben zincir Where fonksiyonlar, kendi sütun kontrolü için her, ben OR ihtiyacım olamaz.

böyle bir sorgu dışarı inşa etmenin bir yolu LINQ kullanarak, var mı?

+0

'Alanı'nda hükmü? http://stackoverflow.com/questions/959752/where-in-clause-in-linq –

+0

Belki 'UNION' size yardımcı olur mu? –

+0

Çalıştığını sanmıyorum çünkü SQL'de bu şeyler tek tek sütunlardır. EF varlık sınıfımda, bu sütunlar her sütun için "bool" özellikleri olarak temsil edilir. Benim işlevimin bir girdisi olarak, doğrulamak için hangi sütunun kontrol edileceğini söyleyen bir dizi "enum" verilir. Yani karşılaştırmak için gerçek bir dizi yok - sadece bireysel bool sütunları/özellikleri. – Ryan

cevap

3

Sen PredicateBuilderor zincir için koşulları kullanabilirsiniz.

+0

Bu C# 5+ sadece mi? Maalesef hala 4,5 yaşındayım. – Ryan

+0

@Ryan No sadece PredicateBuilder sınıfını kendiniz ekleyin. "PredicateBuilder Kaynak Kodu" altında bağlandığım sayfada. – Magnus

+0

@Magnus Sorun, LinqKit'e gereksinim duyması gerektiğidir çünkü EF'yi hedefliyor gibi görünüyor. –

-1

Linq sorgular birbiri üzerine yerleştirilmiş ve veri erişilen kadar yürütülür böylece farklılık gösterdi yürütme kullanır. İşte

gerektiğinde bu iki özel cümleleri oluşturmak için dış koşullardan kapalı anahtarı olabilir basitleştirilmiş örnekte sorgunuzu inşa edebileceğini nasıl.

var myData = TheData.Where(itm => itm.Value == true); 

if ({some condition}) 
    myData = myData.Where(itm => itm.Other == true); 
else 
    myData = myData.Where(itm => itm.SomethingElse == false); 

var result = myData.ToList(); 

nihai sonuç sadece if den where hükümlerin birine sahip olacak ve zamanında dinamik olarak çalıştırılabilir.

+1

Sorun 'Where' bir' ve' olmasıdır. Ben de aynı yaklaşımı kullanarak 'OR 'zincirini arıyorum. – Ryan