【问题标题】:How to utilize EF and LINQ to add filters and specify tables, columns, filters and order by dynamically如何利用 EF 和 LINQ 添加过滤器并动态指定表、列、过滤器和 order by
【发布时间】:2016-02-05 15:57:54
【问题描述】:

我有这样的数据库结构(所有 Parent 和 Childs 都是表),

我在做什么

现在我想创建临时报告页面,让用户选择表格和这些表格中的列。

当用户选择表和列时,他们可以向列添加过滤器(在列表中或包含或过滤依据等)。

我会将所有这些信息以 json 格式发送到将创建的 Web 服务,然后在 Web 服务中我计划使用 EntityFramework 来获取所需的数据集。

我已经做过的事情

我能够创建 HTML UI、Web 服务、带有存储库和 UOW、数据库等的数据库层。

问题

我的意思是我可以做到,

var result = context.ParentA.Include("Child1.SubChild1").Include(....).Where(..

但我不确定如何指定我想要的列或添加过滤器。

【问题讨论】:

    标签: c# entity-framework linq sql-server-2012


    【解决方案1】:

    对于指定列名,您可以像这样在 linq 查询中使用选择:

    var result = context.ParentA.Include("Child1.SubChild1").Include(....).Where(..).select(s=> new {Name = s.ParentName , SubName = s.SubChild.Name });
    

    要添加过滤器,您需要在 where 子句中定义它们

    .Where(p=>p.Name.contains("someValue"))
    

    【讨论】:

      【解决方案2】:

      如果您可以创建一些可以定义过滤器的类,那么您可以创建一个IQueryable<T> 添加过滤器:

      class Filters
      {
          public bool FilterByColumnA { get; set; }
      
          ...
      
          public bool FilterByColumnN { get; set; }
      
      
          public int FromColumnA { get; set; }
      
          public int ToColumnA { get; set; }
      
          ...
      
          public string FromColumnN { get; set; }
      
          public string ToColumnN { get; set; }
      }
      

      然后您可以构建查询:

      IQueryable<Entity> query = context.Set<Entity>();
      
      if (filters.FilterByColumnA)
          query = query.Where(e => e.ColumnA > filters.FromColumnA && e.ColumnA < filters.ToColumnA);
      
      ...
      
      if (filters.FilterByColumnN)
          query = query.Where(e => e.ColumnN > filters.FromColumnN && e.ColumnN < filters.ToColumnN);
      

      您可以查看this question了解更多详情。

      要动态选择属性,您可以使用Include() 选择显式加载:

      DbQuery<Entity> query = context.Set<Entity>();
      
      foreach (var prop in properties)
          query = query.Include(prop);
      

      如果属性被声明为虚拟,那么它们将仅在需要值时才加载到内存中。例如,如果您使用 OData,则可以从 url 创建选择查询。

      另一种解决方案可能是使用Expressions

      但如果您真的需要动态方法,您可以查看nuget package

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-25
        相关资源
        最近更新 更多