在foreach循环中构建的Linq查询始终从最后一次迭代中获取参数值

Bor*_*ens 17 c# linq

我有一个包含几个关键字的列表.我预先通过他们像这样构建我的linq查询(煮沸以消除代码噪音):

List<string> keys = FillKeys()
foreach (string key in keys){
    q = q.Where(c => c.Company.Name.Contains(key));
}
Run Code Online (Sandbox Code Playgroud)

当我现在让我的键包含2个键分别返回结果,但不能一起出现(q中的每个项目都是"xyz"或"123",从不"123"和"xyz"),我仍然得到结果.结果集与它到达的最后一个字符串相同.

我查看了linq查询,看起来它创建了正确的sql,但它用相同的(最后一个itterated)值替换了@ p1 AND @ p2.

我究竟做错了什么?

Jon*_*eet 33

key在lambda表达式中重用了相同的变量().

有关更多详细信息,请参阅我的匿名方法文章,还有一些相关的SO问题:

简单的解决方法是首先复制变量:

List<string> keys = FillKeys()
foreach (string key in keys){
    string copy = key;
    q = q.Where(c => c.Company.Name.Contains(copy));
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ell 14

可能是捕获的变量问题; 尝试添加:

List<string> keys = FillKeys()
foreach (string key in keys){
    string tmp = key;
    q = q.Where(c => c.Company.Name.Contains(tmp));
}
Run Code Online (Sandbox Code Playgroud)