我有一个包含几个关键字的列表.我预先通过他们像这样构建我的linq查询(煮沸以消除代码噪音):
Listkeys = 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.
我究竟做错了什么?
你key
在lambda表达式中重用了相同的变量().
有关更多详细信息,请参阅我的匿名方法文章,还有一些相关的SO问题:
LINQ to SQL bug(或非常奇怪的功能)......
带代理的局部变量
C#在循环中捕获变量
C#得到答案
以编程方式构建LINQ查询而没有局部变量欺骗我
简单的解决方法是首先复制变量:
Listkeys = FillKeys() foreach (string key in keys){ string copy = key; q = q.Where(c => c.Company.Name.Contains(copy)); }
可能是捕获的变量问题; 尝试添加:
Listkeys = FillKeys() foreach (string key in keys){ string tmp = key; q = q.Where(c => c.Company.Name.Contains(tmp)); }