C# 实体框架核心Lambda函数未提前终止

C# 实体框架核心Lambda函数未提前终止,c#,asp.net-mvc,asp.net-core,entity-framework-core,C#,Asp.net Mvc,Asp.net Core,Entity Framework Core,我正在使用asp.net core和entityframework 在进行API调用以获取实体列表时,我传递了一个json中的可选过滤器,该过滤器可能如下所示: { "name": "john", "customer.id": 1 } 在我的ControllerAction中,我首先反序列化JSON,然后查询DB var dynamicfilter = filter != null ? JsonConvert.Deserial

我正在使用asp.net core和entityframework

在进行API调用以获取实体列表时,我传递了一个json中的可选过滤器,该过滤器可能如下所示:

{
  "name": "john",
  "customer.id": 1
}
在我的ControllerAction中,我首先反序列化JSON,然后查询DB

var dynamicfilter = filter != null ? JsonConvert.DeserializeObject<Dictionary<string, string>>(filter) : new Dictionary<string, string>();

List<User> Users = _context.Users.Include(u => u.Customer).Where(u =>
    dynamicfilter.Keys.Count > 0 ? (
        (dynamicfilter.ContainsKey("name") ? u.Name.ToLower().Contains(dynamicfilter["name"].ToLower()) : true) &&
        (dynamicfilter.ContainsKey("customer.id") ? u.Customer.ID == Convert.ToInt32(dynamicfilter["customer.id"]) : true)
    ) : true).ToList();
它就像一个符咒。
有没有办法让它在数据库端也工作?

只需将逻辑移出查询即可。比如:

IQueryable<User> query = _context.Users.Include(u => u.Customer);
query = dynamicfilter.ContainsKey("name") 
    ? query.Where(u=>u.Name.ToLower().Contains(dynamicfilter["name"].ToLower()) 
    : query;
query = dynamicfilter.ContainsKey("customer.id") 
    ? query.Where(u=>u.Customer.ID == Convert.ToInt32(dynamicfilter["customer.id"])) 
    : query;

List<User> Users = query.ToList(); // DB query executed here

只需将逻辑移出查询即可。比如:

IQueryable<User> query = _context.Users.Include(u => u.Customer);
query = dynamicfilter.ContainsKey("name") 
    ? query.Where(u=>u.Name.ToLower().Contains(dynamicfilter["name"].ToLower()) 
    : query;
query = dynamicfilter.ContainsKey("customer.id") 
    ? query.Where(u=>u.Customer.ID == Convert.ToInt32(dynamicfilter["customer.id"])) 
    : query;

List<User> Users = query.ToList(); // DB query executed here

请添加所有相关错误消息。LINQ到SQL引擎可能无法转换
b?a:b
where子句的操作。错误消息为:“KeyNotFoundException:字典中不存在给定的键“name”。System.Collections.Generic.Dictionary.get_Item(TKey)InvalidOperationException:尝试计算LINQ查询参数表达式时引发异常。要显示其他信息,请在重写DbContext.OnConfiguring“”时调用EnableSensitiveDataloging()。是否可以添加所有相关的错误消息。LINQ To SQL引擎可能无法转换
b?a:b
where子句的操作。错误消息为:“KeyNotFoundException:字典中不存在给定的键“name”。System.Collections.Generic.Dictionary.get_Item(TKey)InvalidOperationException:尝试计算LINQ查询参数表达式时引发异常。若要显示其他信息,请在重写DbContext.OnConfiguring时调用EnableSensitiveDataLogging()。
if(dynamicfilter.ContainsKey("name") 
    && !string.IsNullOrWhitespace(dynamicfilter["name"]))
{
    var nameFilter = dynamicfilter["name"].ToLower();
    query = query.Where(u=>u.Name.ToLower().Contains(nameFilter);
}