【问题标题】:Using dynamic filters with Entity Framework Core在 Entity Framework Core 中使用动态过滤器
【发布时间】:2020-07-10 10:51:54
【问题描述】:

我正在开发一个使用 Entity Framework Core 的应用程序(.Net Core 3.1、C# 8)。

我想用几个过滤选项过滤一个表。

我在 JSON 中获取过滤条件,并将其反序列化为一个对象。我想编写一个 where LINQ 查询,它将根据这些动态过滤选项过滤表。

问题是我需要使用许多选项和组合来管理过滤。

  • 您可以过滤marketcountryvendor,其余过滤选项将为null
  • 您想过滤 countryvendor,那么 market 将是 null 以及其余的过滤器选项。

我正在查询一个巨大的表,因此编写一个完全转换为 SQL 的查询很重要。

以下代码无法正常工作。我正在寻找可以解决此问题的类似方法:

var filters = new demoFilterEntity()
{
      Market = new List<string>() { "LAT", "NAM" }
};

var filteredData = demoMainRepository.GetAll().Where(x =>
      x.Market != null && (filters.Market != null ? filters.Market.Contains(x.Market) : false) &&
      x.Country != null && (filters.Country != null ? filters.Country.Contains(x.Market) : false)).ToList();

我会很感激关于如何解决这个问题并动态管理过滤的建议。

【问题讨论】:

    标签: c# entity-framework .net-core entity-framework-core asp.net-core-3.1


    【解决方案1】:

    如果您只有AND 条件,您可以通过链接Where 子句来做到这一点:

    var query = demoMainRepository.GetAll().Where(x => x.Market != null); 
    if(filters.Market != null)
    {
        query = query.Where(x => filters.Market.Contains(x.Market));
    }
    ...
    var filteredData = query.ToList();
    

    正如@Lajos Arpad 所说,也许您需要考虑将字段空检查(即x.Market != null)与过滤器检查相结合:

    var query = demoMainRepository.GetAll(); 
    if(filters.Market != null)
    {
        query = query.Where(x =>  x.Market != null && filters.Market.Contains(x.Market));
    }
    ...
    var filteredData = query.ToList();
    

    【讨论】:

    • 使用PredicateBuilder,您也可以使用Or 运算符。
    • @PeterCsala 是的,或者自己用表达式树构建它 =)
    【解决方案2】:

    我目前正在研究这个话题,发现dynamic lambda expressions 是一个东西 .Where 方法接受您可以动态创建的 Expression&lt;Func&lt;Entity, bool&gt;&gt; 类型。

    有点麻烦,但是一旦你把头绕在它周围,它就会很好用

    我在Codemag Dynamic Lambda Expressions推荐这篇文章

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-09
      • 2022-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多