据我了解,当我使用 LINQ 扩展方法(带有 lambda 表达式语法)时IQueryable
那是在事实实例中ObjectSet
它们被转换为 LINQ to SQL 查询。我的意思是这个命令
IQueryable<User> users = db.UserSet;
var users32YearsOld = users.Where(user => user.Age == 32);
完全一样
IQueryable<User> users = db.UserSet;
var users32YearsOld = from user in users where user.Age == 32 select user;
所以他们中没有一个会访问数据库,直到他们users32YearsOld
被枚举在 for 循环等中。 (希望我正确理解这一点)。
但如果我不掩盖这一点将会发生什么ObjectSet
as IQueryable
but as IEnumerable
?所以如果它的类型是IEnumerable
?
IEnumerable<User> users = db.UserSet;
var users32YearsOld = users.Where(user => user.Age == 32);
它会立即访问数据库吗(如果是的话,那么什么时候?就在第一行还是第二行)?或者它的行为是否会像之前的命令一样,直到users32YearsOld
被列举 ?如果我使用以下代替会有什么区别吗?
IEnumerable<User> users = db.UserSet;
var users32YearsOld = from user in users where user.Age == 32 select user;
谢谢
取消删除我的答案,因为我刚刚测试了它,它的工作原理与我所描述的完全一样:
由于没有枚举,上述查询都不会访问数据库。和...之间的不同IQueryable
查询和IEnumerable
查询是在以下情况下IQueryable
过滤将在数据库服务器上执行,而在以下情况下IEnumerable
所有对象都将从数据库加载到内存,并且过滤将在 .NET 代码(linq-to-objects)中完成。正如您可以想象的那样,这通常是性能杀手。
我在项目中编写了简单的测试:
[TestMethod]
public void Test()
{
// ObjectQuery<Department> converted ot IEnumerable<Department>
IEnumerable<Department> departmetns = CreateUnitOfWork().GetRepository<Department>().GetQuery();
// No query execution here - Enumerable has also deffered exection
var query = departmetns.Where(d => d.Id == 1);
// Queries ALL DEPARTMENTS here and executes First on the retrieved result set
var result = departmetns.First();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)