EF 6.复杂查询。搜索和过滤

时间:2015-07-09 10:58:51

标签: c# performance entity-framework search linq-to-sql

我在我的asp.net mvc应用程序中使用Entity Framework 6。 我有一个复杂的数据库查询,导致大约15个表。 查询包括搜索和过滤。此查询执行很慢(本地计算机上大约800毫秒)。

query.Include(i => i.Customer) 
     .Include(i => i.Address) 
      ... 
     .Include(i => i.Photos)
     .Select(x => new {
      ...
      x.Address.City,
      CustomerName = i.Customer != null ? i.Customer.Name : "",
      ...
    });

...
//searching & filtering
// searchFilter.PropertyName and searchFilter.PropertyValue - strings!
// for example searchFilter.PropertyName = 'CustomerName'
 query = query.Where(String.Format("{0} == {1}", searchFilter.PropertyName, searchFilter.PropertyValue));
// PageIndex = 20
 query = query.Skip(PageIndex * PageSize).Take(PageSize)
...
 var result = query.ToList();
...

问题:

  1. 急切加载无法正常工作 - MiniProfiler显示地址表的重复请求
  2. 这样的搜索(使用'包含')是非常有限的,因为我必须创建具有Customer等属性的匿名类型对象,以检查Customer是否为空(或更复杂的操作)并且必须努力代码某处PropertyName' s字符串(例如在调用ajax请求的javascript文件中)。
  3. 还有其他方法吗?

1 个答案:

答案 0 :(得分:0)

一些评论:

  • 您不需要include(i => i.Address)选择x.Address.City,也不需要测试where子句中的任何地址属性
  • 只要您拥有与Sql Server的IQueryable绑定,CustomerName = i.Customer != null ? i.Customer.Name : ""就可以替换为CustomerName = i.Customer.Name ?? ""

不确定这会对性能产生重大影响,但......

否则,通常情况下,索引创建是提高性能的途径。