使用具有实体框架的LINQ语句以编程方式构建查询

时间:2014-02-06 23:16:12

标签: c# linq entity-framework entity-framework-5

假设我有一个类似的查询:

r = r.Where(x => iEnumerableMachineNames.Contains(x.Machine.Name) 
                 || x.Server==true);

有没有办法在语句之外构建谓词(我认为这就是它所谓的),例如

t = (x => iEnumerableMachineNames.Contains(x.Machine.Name));
s = (x => x.Server==true)
q = t.Or(s);
r = r.Where(x => q);

基本上我想基于输入参数以编程方式构建我的查询,对于EF 5。

1 个答案:

答案 0 :(得分:1)

您可以动态构建表达式,但不能像伪代码那样简单 - 它需要反射和表达式树(read this)。

实现您想要做的事情的一种简单方法是使用布尔标志来短路谓词的不同部分:

bool testMachineName;
bool testIsServer;

r = r.Where( x =>
    ( !testMachineName || iEnumerableMachineNames.Contains( x.Machine.Name ) ) ||
    ( !testIsServer || x.Server ) );