Rob*_*ben 2 .net c# linq c#-4.0
我有以下foreach表达式,我在其中构建谓词,然后通过执行过滤集合.Where().
但是result.Count()让我感到困惑的是,0甚至在我.Where()在下一次迭代中执行之前就给了我.
var result = SourceCollection;
foreach (var fieldName in FilterKeys)
{
if (!conditions.ContainsKey(fieldName)) continue;
if (!conditions[fieldName].IsNotNullOrEmpty()) continue;
var param = conditions[fieldName];
Func<BaseEntity, bool> predicate = (d) => fieldName != null && d.GetFieldValue(fieldName).ContainsIgnoreCase(param);
result = result.Where(predicate);
}
Run Code Online (Sandbox Code Playgroud)
是否有人知道我可能忽略的任何LINQ行为导致了这种情况?
我想,你想要这个:
var result = SourceCollection;
foreach (var fieldName in FilterKeys)
{
if (!conditions.ContainsKey(fieldName)) continue;
if (!conditions[fieldName].IsNotNullOrEmpty()) continue;
var param = conditions[fieldName];
var f = fieldName
Func<BaseEntity, bool> predicate = (d) => f != null && d.GetFieldValue(f).ContainsIgnoreCase(param);
result = result.Where(predicate);
}
Run Code Online (Sandbox Code Playgroud)
注意f在谓词中的使用.您不想捕获foreach变量.在原始代码中,当第二次迭代开始时,param仍然是第一次迭代中捕获的值,但fieldName已更改.