当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在foreach循环中构建的Linq查询始终从最后一次迭代中获取参数值》经验,为你挑选了2个好方法。

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

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

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

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

我究竟做错了什么?



1> Jon Skeet..:

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

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

LINQ to SQL bug(或非常奇怪的功能)......

带代理的局部变量

C#在循环中捕获变量

C#得到答案

以编程方式构建LINQ查询而没有局部变量欺骗我

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

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



2> Marc Gravell..:

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

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

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有