将动态过滤器与 Entity Framework 核心一起使用
Using dynamic filters with Entity Framework Core
我正在开发一个使用 Entity Framework Core 的应用程序(.Net Core 3.1,C# 8)。
我想用几个过滤选项过滤 table。
我在 JSON 中获取筛选条件,并将其反序列化为一个对象。我想编写一个 where LINQ 查询,它将根据那些动态过滤选项过滤 table。
问题是我需要使用许多选项和组合来管理过滤。
- 您可以筛选
market
、country
、vendor
,其余筛选选项将为 null
。
- 您想要筛选
country
和 vendor
,那么 market
将是 null
以及其余的筛选选项。
我正在查询一个巨大的 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
我正在开发一个使用 Entity Framework Core 的应用程序(.Net Core 3.1,C# 8)。
我想用几个过滤选项过滤 table。
我在 JSON 中获取筛选条件,并将其反序列化为一个对象。我想编写一个 where LINQ 查询,它将根据那些动态过滤选项过滤 table。
问题是我需要使用许多选项和组合来管理过滤。
- 您可以筛选
market
、country
、vendor
,其余筛选选项将为null
。 - 您想要筛选
country
和vendor
,那么market
将是null
以及其余的筛选选项。
我正在查询一个巨大的 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