一尘不染

内置于foreach循环中的Linq查询始终从上次迭代中获取参数值

c#

我有一个包含几个关键字的列表。我像这样(通过煮熟以消除代码噪音)遍历他们,与他们建立我的linq查询:

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

现在,当我使我的键包含两个分别返回结果但不能同时出现的键(q中的每个项目都不是“ xyz”或“ 123”,从不“ 123”和“
xyz”)时,我仍然会得到结果。然后,结果集与其到达的最后一个字符串相同。

我看了一下linq查询,看起来它创建了正确的sql,但是它用相同的(最后一个有效值)替换了@ p1和@ p2。

我究竟做错了什么?


阅读 260

收藏
2020-05-19

共1个答案

一尘不染

您正在keylambda表达式中重复使用相同的变量()。

请参阅我有关匿名方法的文章以了解更多详细信息,并且还有许多相关的SO问题:

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

List<string> keys = FillKeys()
foreach (string key in keys){
    string copy = key;
    q = q.Where(c => c.Company.Name.Contains(copy));
}
2020-05-19