【问题标题】:Entity Framework efficient query filter实体框架高效查询过滤器
【发布时间】:2012-02-13 11:51:59
【问题描述】:

在我的 mvc 站点中,我使用 EF 4.1 进行数据访问。现在我开发产品搜索功能。获取过滤产品的方法签名是:

PagedList<Dress> GetDressesPage<TKey>(int page, int dressesPerPage, Func<Dress, bool> selection, Func<Dress, TKey> order, SortDirection direction);

而我获得产品的方式是:

dresses = _context.Dresses.Where(selection).OrderBy(order).Skip(page * dressesPerPage).Take(dressesPerPage).ToList();

问题出在selection功能上。我希望能够通过附加不同的条件来构建它。现在我正在为每个参数组合使用一些 if 子句来构建它......但这变得太复杂了。

你知道我可以将过滤器作为参数传递的更简单的方法吗?

【问题讨论】:

    标签: .net entity-framework entity-framework-4


    【解决方案1】:

    使用Predicate Builder。将Func&lt;Dress, bool&gt; 替换为Expression&lt;Func&lt;Dress, bool&gt;&gt;。否则查询将变成 LINQ-to-Objects。

      var predicate = PredicateBuilder.True<Dress>();
      if (!string.IsNullOrEmpty(name))
      {
           predicate = predicate.And(d => d.Name.Contains(name));
      }
    
      dresses = _context.Dresses.Where(predicate).OrderBy(order)
          .Skip(page * dressesPerPage).Take(dressesPerPage).ToList();
    

    【讨论】:

      【解决方案2】:

      一个完美的库是“LinqKit”。

      示例用法:

          public static IEnumerable<DressItem> QueryDresses(FashionEntities ctx, Expression<Func<dresses, bool>> predicate)
          {
              var query = (from dress in ctx.dresses
                               .AsExpandable()
                               .Where(predicate)                    
                        select new DressItem { 
                            id = dress.Id, 
                            name = dress.Name, 
                            price = dress.Price 
                        };
              return query;
          }
      

      如您所见,该方法接受一个谓词,您可以在调用方法中构造该谓词,如下所示:

        Expression<Func<dresses, bool>> predicate = d => d.Price > 1000;
      
        if (lalalala == llalala) {
            predicate = d => d.Price > 2000;
        }
      
        var result = new List<DressItem>();
        using (var ctx = new FashionEntities())
        {
             var dresses = QueryDresses(ctx, predicate.Expand());
             result = dresses.ToList();
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-18
        • 2019-03-30
        • 1970-01-01
        • 1970-01-01
        • 2017-11-08
        • 2015-12-29
        • 1970-01-01
        相关资源
        最近更新 更多