2011-05-05 30 views
4

我試圖創建下面的SQL示例中的equivelant LINQ查詢多個手術室裏面:如何創建SQL嵌套AND將使用LINQ

SELECT * 
FROM FOO 
WHERE 
    ((a == <val1>) AND (b == <val2>) AND (c == <val3>)) 
OR 
    ((a == <val4>) AND (b == <val5>) AND (c == <val6>)) 

總是會有一個A,B和C將會被OR包圍在一起。這種模式可能發生n次。

唯一的解決方案,我發現工作是使用LINQ的聯盟,但生成的SQL不是我想要的。

回答

1

嘗試實施PredicateBuilder類。

那麼也許你可以使用這樣的事情:

var pred = PredicateBuilder.False<Foo>(); 

foreach(var criteria in myCriteriaSet) 
{    
    pred = pred.Or(x => x.ID== criteria.ID && 
         x.Name== criteria.Name && 
         x.Created == criteria.SomeDate); 
} 

var matching = db.Foos.Where(pred); 

這就假定你的標準是枚舉。根據需要修改以適應您的需求。

+0

我需要下載LINQKit,因爲我需要AsExpandable(),因爲我使用的是LINQ to Entities,但它的工作方式就像一個魅力。 – 2011-05-06 01:13:36

1

可以使一個長期的條件語句:

var foo = from f in db.Foos.Where((f => f.A == val1 && f.b == val2 && f.c == val3) || 
            (f => f.A == val4 && f.b == val5 && f.c == val6)) 

或者說,這是最好IMO:

var predicate = PredicateBuilder.False<Foo>(); 
predicate = predicate.Or(f => f.A == val1 && f.A == val2 && f.A == val3); 
predicate = predicate.Or(f => f.A == val4 && f.A == val5 && f.A == val6); 
var foo = db.Foos.Where(predicate); 

這些可以是有條件的也:

var predicate = PredicateBuilder.False<Foo>(); 
predicate = predicate.Or(f => f.A == val1 && f.A == val2 && f.A == val3); 
if (condition) 
    predicate = predicate.Or(f => f.A == val4 && f.A == val5 && f.A == val6); 
var foo = db.Foos.Where(predicate);