2010-07-09 94 views
2

我需要建立一個LINQ查詢,它允許我改變連接表上的where子句,但是找不到辦法做到這一點。應用動態where子句加入表

兩個查詢我構造的簡化例子有:

var myQuery = from tab1 in context.Table1 
       join tab2 in context.Table2 on Table1.ID equals Table2.Table1ID 
       where tab1.TypeCode == 3 
        tab2.SomeID == 4 && 
       select tab1.ID; 

var myQuery2 = from tab1 in context.Table1 
       join tab2 in context.Table2 on Table1.ID equals Table2.Table1ID 
       where tab1.TypeCode == 3 
        tab2.SomeOtherID == 4 && 
       select tab1.ID; 

它們之間唯一的區別是tab2.SomeID where子句更改tab2.SomeOtherID。

如果更改where子句被應用到tab1我可以在查詢中添加一個.Where但我該如何使用通用查詢並指定不同的tab2 where子句?

回答

1

可以有可選的參數中的查詢:

int? someID = null; 
int? someOtherID = 4; 

var myQuery = from tab1 in context.Table1 
       join tab2 in context.Table2 on Table1.ID equals Table2.Table1ID 
       where tab1.TypeCode == 3 
       && (someID == null || tab2.SomeID == someID) 
       && (someOtherID == null || tab2.SomeOtherID == someOtherID) 
       select tab1.ID; 

LINQ到SQL將消除,可以從查詢在上面的例子中進行評價的客戶端,因此,零件的where子句將過濾上tab1.TypeCode和tab2.SomeOtherID。

+0

我實際上使用這種方法,並認爲L2S將刪除冗餘的條件。然而,它沒有,並且在SQL中有1 == 0的地方並不重要,我希望有一個更清晰的方法。 – sipwiz 2010-07-09 11:53:46

+0

再次檢查您的查詢 - 除非您使用Linq-to-SQL的「編譯查詢」,否則L2S應該消除查詢中不必要的部分。 (即,可以在客戶端進行評估的部分) – KristoferA 2010-07-10 03:09:45

+0

L2S在消除查詢的不必要部分方面不是那麼複雜。我必須減少表達式是LINQ爲true或false來讓它們消除。儘管這是我能找到的最好的方法。 – sipwiz 2010-07-12 01:30:09

2
+0

我在過去使用DynamicLinq的效果很好,但在這種情況下,我想保持我的查詢強類型。 – sipwiz 2010-07-09 05:18:09

+0

比使用PredicateBuilder會爲你工作鏈接alreay那裏在回答 – 2010-07-09 05:24:44