Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 准备动态过滤器_C#_Linq_Filter - Fatal编程技术网

C# 准备动态过滤器

C# 准备动态过滤器,c#,linq,filter,C#,Linq,Filter,我们正在准备用于过滤记录的动态过滤器。我们应该能够选择一个实体(比如说Person),然后根据选择的实体定义过滤器 设计与此类似 那么,如何设计这样一个可以用于任何实体和任何属性的过滤系统呢 我们需要使用 # MVC5 我已经使用WPF创建了一个动态过滤器功能,就像我使用LINQ到SQL ORM一样,使用我的DataContext获取所有表及其对应的字段(MetaDataMember),并使用它构建UI IEnumerable<MetaTable> mappedTables = D

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

设计与此类似

那么,如何设计这样一个可以用于任何实体和任何属性的过滤系统呢

我们需要使用

  • #
  • MVC5

  • 我已经使用WPF创建了一个动态过滤器功能,就像我使用LINQ到SQL ORM一样,使用我的DataContext获取所有表及其对应的字段(MetaDataMember),并使用它构建UI

    IEnumerable<MetaTable> mappedTables = DBContext.Mapping.GetTables();
    IEnumerable<MetaDataMember> tablesColumns = mappedTables.SelectMany(t => t.RowType.DataMembers);
    
    然后构建条件,即Expression.LessThan(etc),并继续使用每个条件的连接表达式(Expression.AndAlso或Expression.OrElse)为每个条件构建树,最后创建lambda表达式并将其传递给.Where()Linq扩展方法获取我的IQueryable筛选值,并使用它筛选UI

    IQueryable<SomeTable> results = DataContext.SomeTable.Where(whereLambdaExpression).Select(selectLambdaExpression);
    
    IQueryable results=DataContext.SomeTable.Where(whereLambdaExpression)。选择(selectLambdaExpression);
    
    我采用这种方法的原因是,在枚举(results.ToList())发生之前,查询不会执行,查询是在DB服务器中执行的,而不是在当前应用程序中执行的。LINQ将查询表达式转换为纯SQL语句,只返回结果。这是相当快的,因为一切都发生在数据库服务器


    我不能粘贴我所有的代码,因为它相当大,但你可以理解它的要点

    我遇到了这种问题,我通过将文本编译为LINQ查询并在数据(集合)上执行它并收集结果来解决它。它不会在每次需要动态编译程序集时为您提供最佳性能(我将其用于10万行的集合,效果很好)。但是,它非常灵活。您可以进一步优化它。代码很长,所以下面是代码

    主要思想如下:

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

    我共享的github链接有一个简单的工作应用程序,带有示例和投影。

    可能使用泛型。
    IQueryable<SomeTable> results = DataContext.SomeTable.Where(whereLambdaExpression).Select(selectLambdaExpression);