【发布时间】:2014-01-24 20:33:46
【问题描述】:
我在使用 Microsoft App Studio 创建的项目中的 Filter.cs 文件中找到了以下代码。虽然我是一名资深的 C# 程序员,但我缺乏使用 LINQ 谓词表达式构建器的经验。我可以说它下面的代码是“元逻辑”,用于在给定包含类型字段信息的过滤谓词列表和要注入子表达式的一组数据值的情况下灵活构建查询。我想不通的是以下语句中的“表达式”变量:
query = query.Where(expression).AsQueryable()"
.. 将每个字段表达式连接成一个更复杂的查询表达式,最终在代码末尾执行以创建 ObservableCollection 结果。如果它是“query +=”,我可以推断出像事件处理程序字段这样的链接操作,但作为一个直接的赋值语句,它让我感到困惑,因为我希望它替换最后一个值 表达式 变量从上次循环迭代中获得,从而在过程中将其重置并丢失其先前的值。这是怎么回事?
public class Filter<T>
{
public static ObservableCollection<T> FilterCollection(
FilterSpecification filter, IEnumerable<T> data)
{
IQueryable<T> query = data.AsQueryable();
foreach (var predicate in filter.Predicates)
{
Func<T, bool> expression;
var predicateAux = predicate;
switch (predicate.Operator)
{
case ColumnOperatorEnum.Contains:
expression = x => predicateAux.GetFieldValue(x).ToLower().Contains(predicateAux.Value.ToString().ToLower());
break;
case ColumnOperatorEnum.StartsWith:
expression = x => predicateAux.GetFieldValue(x).ToLower().StartsWith(predicateAux.Value.ToString().ToLower());
break;
case ColumnOperatorEnum.GreaterThan:
expression = x => String.Compare(predicateAux.GetFieldValue(x).ToLower(), predicateAux.Value.ToString().ToLower(), StringComparison.Ordinal) > 0;
break;
case ColumnOperatorEnum.LessThan:
expression = x => String.Compare(predicateAux.GetFieldValue(x).ToLower(), predicateAux.Value.ToString().ToLower(), StringComparison.Ordinal) < 0;
break;
case ColumnOperatorEnum.NotEquals:
expression = x => !predicateAux.GetFieldValue(x).Equals(predicateAux.Value.ToString(), StringComparison.InvariantCultureIgnoreCase);
break;
default:
expression = x => predicateAux.GetFieldValue(x).Equals(predicateAux.Value.ToString(), StringComparison.InvariantCultureIgnoreCase);
break;
}
// Why doesn't this assignment wipe out the expression function value from the last loop iteration?
query = query.Where(expression).AsQueryable();
}
return new ObservableCollection<T>(query);
}
【问题讨论】:
-
我已更改标题/标签,因为问题确实没有关于电话应用程序的具体内容。随时恢复/改进。
-
@AlexeiLevenkov 编辑得很好,谢谢。
标签: c# linq ienumerable predicatebuilder