准备动态过滤器

时间:2015-05-04 21:50:25

标签: c# linq filter

我们正在准备动态过滤器,用于过滤记录。我们应该能够选择一个实体(让我们说Person)然后根据所选择的实体定义过滤器。

设计与此类似。

enter image description here

那么如何设计一个可以与任何实体和任何属性一起使用的过滤系统呢?

我们需要使用

  1. C#
  2. MVC 5

2 个答案:

答案 0 :(得分:0)

我使用WPF创建了一个动态过滤器功能,我这样做的方式是使用LINQ To SQL ORM,使用我的DataContext我获取所有表及其对应的字段(MetaDataMember)并使用它构建UI

IEnumerable<MetaTable> mappedTables = DBContext.Mapping.GetTables();
IEnumerable<MetaDataMember> tablesColumns = mappedTables.SelectMany(t => t.RowType.DataMembers);

然后我使用MetaDataMember及其属性为用户创建的每个条件动态构建Expression Trees

Type entityType = metaDataMember.DeclaringType.Type;
ParameterExpression parameterExpression = Expression.Parameter(entityType, "t"); // t => t; t is the parameterExpression representing the Table type

MemberExpression leftStringExpression = Expression.PropertyOrField(parameterExpression, metaDataMember.Name); // t => t.columnName

然后构建条件,即Expression.LessThan(etc),并为每个条件使用连接表达式(Expression.AndAlso或Expression.OrElse)为每个条件构建树,然后最终创建一个lambda表达式{{3并将它传递给.Where()Linq Extension方法来获取我的IQueryable&lt;&gt;过滤后的值并使用它来过滤UI。

IQueryable<SomeTable> results = DataContext.SomeTable.Where(whereLambdaExpression).Select(selectLambdaExpression);

我采用这种方法的原因是因为查询在枚举(results.ToList())发生之前不会被执行,并且查询在DB服务器中执行而不是在当前应用程序中执行。 LINQ将查询表达式转换为纯SQL语句,仅返回结果。它在数据库服务器中发生的一切都非常快。

我无法粘贴所有代码,因为它非常庞大,但你得到了它的要点。

答案 1 :(得分:0)

我遇到过这种问题,我通过将文本编译为LINQ查询并在数据(集合)上执行并收集结果来解决它。每次需要动态编译程序集时,它都不会给你最好的性能(我已经将它用于集合大到100K行并且运行良好)。但是,它非常灵活。你可以进一步调整它。代码很长,所以这里是github link

这是主要的想法:

  • 创建一个有效的linq查询表达式作为字符串
  • 将其编译为程序集
  • 将程序集加载到内存中并将输入集合传递给程序集
  • 收集输出并使用它。

我分享的github链接有一个简单的工作应用程序,包含样本和投影。