C# 使用具有实体框架核心的动态过滤器

C# 使用具有实体框架核心的动态过滤器,c#,entity-framework,.net-core,entity-framework-core,asp.net-core-3.1,C#,Entity Framework,.net Core,Entity Framework Core,Asp.net Core 3.1,我正在开发一个应用程序(.netcore 3.1,C#8),它使用实体框架核心 我想用几个筛选选项筛选一个表 我用JSON获取过滤条件,并将其反序列化为一个对象。我想写一个where LINQ查询,它将根据这些动态过滤选项过滤表 问题是,我需要使用许多选项和组合来管理过滤 您可以筛选市场,国家,供应商,其余筛选选项将为空 如果您想筛选国家/地区和供应商,则市场将为空,以及其他筛选选项 我正在查询一个巨大的表,因此编写一个完全转换为SQL的查询非常重要 以下代码工作不正常。我正在寻找类似的方法

我正在开发一个应用程序(.netcore 3.1,C#8),它使用实体框架核心

我想用几个筛选选项筛选一个表

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

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

  • 您可以筛选
    市场
    国家
    供应商
    ,其余筛选选项将为
  • 如果您想筛选
    国家/地区
    供应商
    ,则
    市场
    将为
    ,以及其他筛选选项
我正在查询一个巨大的表,因此编写一个完全转换为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();
var filters=new demoFilterEntity()
{
市场=新列表(){“LAT”,“NAM”}
};
var filteredData=demoMainRepository.GetAll()。其中(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();

如果您只有
条件,可以通过链接
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();

也可能说,您需要考虑使用过滤器检查:将字段NULL检查(即“代码> X.Sale.= 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();

使用,您还可以使用
运算符。@PeterCsala是的,或者自己使用表达式树来构建它=)