C# 实体框架核心Lambda函数未提前终止
我正在使用asp.net core和entityframework 在进行API调用以获取实体列表时,我传递了一个json中的可选过滤器,该过滤器可能如下所示: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
{
"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);
}