将动态过滤器与 Entity Framework 核心一起使用

Using dynamic filters with Entity Framework Core

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

我想用几个过滤选项过滤 table。

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

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

我正在查询一个巨大的 table,因此编写一个完全转换为 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();

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

如果您只有 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();

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

有点麻烦,但一旦你全神贯注,它就会很好用

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