我有一个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中为每条记录执行。
这是否属实?
感谢。
答案 0 :(得分:0)
第二个查询的性能优于第一个查询不是由于外部Where
子句。您必须在SQL服务器端查询(即IQueryable
)上避免这些操作。例如{ {1}},D.Code.IndexOf(",") >= 0
和D.Code.Substring(0, D.Code.IndexOf(","))
。当您将这些操作与SQL Server端查询一起使用时,这些操作会花费更多时间。
从服务器获取数据后执行这些操作。换句话说,在内存中进行操作(即Contains
)。在第二次查询时,没有这么耗时的操作。这就是为什么第二个查询显示的原因更好的性能。