使用Entity Framework和LINQ语句编程构建查询

4

假设我有一个查询,像这样:

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个回答

1
你可以动态构建表达式,但它不像你的伪代码那样简单 - 它需要使用反射和表达式树(阅读此文)。
实现你想要做的事情的一种简单方法是使用布尔标志来短路谓词的不同部分。
bool testMachineName;
bool testIsServer;

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

这个能在EF中工作吗?还是会抱怨无法构建查询?我猜我会试一下... :-) - Matt
实际上,这并不起作用,会返回所有的东西,对吧?如果testMachine为false,则(true || whatever)== true,并返回所有内容...或者我疯了吗? - Matt
这就是为什么它是 !testXyz - 如果你想要一个特定的测试,表达式将会评估为假并强制剩余的布尔表达式进行评估。如果你不想测试 x.Server == true,那么你设置 testIsServer = false 并且它将评估为 true,从而不过滤掉那些不是 !x.Server 的项目。 - Moho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接