2010-07-09 102 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