在LINQ-to-Entities中,可以通过执行以下操作来查询实体:
var students = SchoolContext.Students.Where(s => s.Name == "Foo" && s.Id == 1);
我知道在幕后,它将被转换为SQL,类似于:
SELECT *
FROM Students
WHERE Name = 'Foo' AND Id = 1
但是,如果我写:
var students =
SchoolContext.Students
.Where(s => s.Name == "Foo")
.Where(s => s.Id == 1);
它会被转换成相同的SQL查询吗?根据我的理解,.Where()
将返回IEnumerable<T>
,因此第二个.Where()
将过滤内存中的实体,而不是将IQueryable<T>
转换为SQL,对吗?
发布于 2013-10-15 17:21:44
第一个.Where()
子句仍将返回IQueryable<T>
。只要你在IQueryable<T>
上操作,它就会继续构建SQL查询,并在需要将集合放入内存时执行它(例如:在foreach
循环或ToList()
操作中使用时,@anaximander声明)。
因此:
SchoolContext.Students.Where(s => s.Name == "Foo").Where(s => s.Id == 1);
仍然会转化为:
SELECT *
FROM Students
WHERE Name = 'Foo' AND Id = 1
而以下两个语句将转换为相同的查询:
SchoolContext.Students.Where(s => s.Name == "Foo").Where(s => s.Id == 1);
SchoolContext.Students.Where(s => s.Name == "Foo" && s.Id == 1);
发布于 2013-10-15 17:19:14
首先,Where返回IQueryable<T>
,因此不会有性能差异。
发布于 2013-10-15 17:24:03
获取Linqpad,并在那里尝试不同的查询。您可以直接向您的实体添加连接,运行查询,并查看在每种情况下生成哪种SQL。体验Linq的绝佳方式。
https://stackoverflow.com/questions/19377449
复制相似问题