实体框架查询中的条件性能

时间:2016-10-15 13:29:18

标签: sql-server performance entity-framework

我有一个SQL Server数据库和两个返回相同结果的Entity Framework查询:

查询1

var query = (from dd in db.Departments
             where (
                 from D in db.Departments
                 join DP in db.DepartmentPersonnels on D.ID equals DP.DepartmentID
                 join P in db.Personnels on DP.PersonneID equals P.ID
                 where P.UserName == Username && D.Code.IndexOf(",") >= 0
                 select D.Code.Substring(0, D.Code.IndexOf(","))).Contains(dd.Code)
                 select dd).FirstOrDefault();

QUERY2

var query = (from dd in db.Departments
             join DP in db.DepartmentPersonnels on dd.ID equals DP.DepartmentID
             join P in db.Personnels on DP.PersonneID equals P.ID
             where P.UserName.Trim().ToLower() == Username.Trim().ToLower()
             select dd).FirstOrDefault();
if (query != null)
 {
  string Code = query.Code.Split(',')[0];        
  retVal = (from d in db.Departments
  where d.Code == Code
  select d).FirstOrDefault();
 }

我在许多帖子中阅读了EF表现,但我没有找到有关条件表现的信息。

我认为Query2在性能方面优于Query1,因为外部where中的from条件将在SQL Server中为每条记录执行。

这是否属实?

感谢。

1 个答案:

答案 0 :(得分:0)

第二个查询的性能优于第一个查询不是由于外部Where子句。您必须在SQL服务器端查询(即IQueryable)上避免这些操作。例如{ {1}},D.Code.IndexOf(",") >= 0D.Code.Substring(0, D.Code.IndexOf(","))。当您将这些操作与SQL Server端查询一起使用时,这些操作会花费更多时间。

从服务器获取数据后执行这些操作。换句话说,在内存中进行操作(即Contains)。在第二次查询时,没有这么耗时的操作。这就是为什么第二个查询显示的原因更好的性能。