2010-11-18 16 views
2

"Komutlar" ve "durumlar" içeren bir veritabanı tablom var. Her komutun birkaç durumu olabilir ve kullanıcı bunu arama sırasında yapılandırabilir. Örneğin, komut "Çalıştır" olabilir ve iki durumu olabilir: "Hızlı" ve "Yavaş".Linq-to-sql yardımını kullanarak gelişmiş veritabanı araması

"Hızlı" veya "Hızlı" ile "Çalıştır" adlı tüm komutlar için tablomu aramak istiyorum.

var results = from t in table 
       where t.Command == "Run" && 
       (t.State == "Fast" || t.State == "Slow") 
       return t; 

Kullanıcı ayrıca devlet "Hızlı" ile komut "Yürüyüşü" arama yapabilir Ancak, ve böylece sorgu gibi görünecektir: Bu yapmak oldukça basittir

var results = from t in table 
        where (t.Command == "Run" && 
         (t.State == "Fast" || t.State == "Slow")) || 
        (t.Command == "Walk" && 
        t.State == "Fast") 
        return t; 

için bir potansiyel var Böyle birçok aramalar gibi, ve onları bir çeşit döngü içinde nasıl birleştireceğini merak ediyorum.

Bunu yapamazsınız: "Yürü" o "Run" araması kez "yürü" öylesine soran sonuçların dışında bırakılmasından

foreach(var command in commands) 
{ 
    foreach(var state in command.states) 
    { 
     results = from t in table 
        where t.Command == command.Command && 
        t.State == state; 
    } 
} 

çünkü hiç YOK sonuçlarına yol açacaktır.

Bunu yapmak için iyi bir yöntem bilen var mı?

cevap

7

Kullanım Joe Albahari en PredicateBuilder bir yüklemi inşa etmek:

var predicate = PredicateBuilder.False<Entry>(); 
foreach(var command in commands) 
{ 
    foreach(var state in command.states) 
    { 
     predicate = predicate.Or(p => p.Command == command.Command && p.State == state); 
    } 
} 
var query = table.Where(predicate); 

Veya daha LINQ ağır versiyon:

var commandStates = from c in commands 
        from s in c.states 
        select new {c.Command, State = s}; 
var predicate = commandStates.Aggregate(
    PredicateBuilder.False<Entry>(), 
    (pred, e) => pred.Or(p => p.Command == e.Command && p.State == e.state)); 
var query = table.Where(predicate); 
+0

+1 geçmeli - neredeyse :) –

+0

bu aslında çok zamanında (yüklem Oluşturucu) gibi cümleleri nerede araya toparlarken - güzel bulmak. başarın nasıl oldu? –

+0

@jim: Aslında buna henüz ihtiyacım olmadı. Yaptığımız şeylerin çoğu ya ihtiyaç duymayacak kadar basit ya da tüm ifade ağacını el ile yapmam gerekecek kadar gelişmiş. PredicateBuilder kullanıyorsanız, genellikle LinqKit'e bakmak isteyebilirsiniz. Bu yüklemleri ve şeyleri çağırmak için bazı kullanışlı özelliklere sahiptir. – StriplingWarrior