gpt4 book ai didi

c# - 使用 IEnumerable 和 IQueryable 作为 ObjectSet 类型时的区别

转载 作者:太空狗 更新时间:2023-10-29 19:56:18 25 4
gpt4 key购买 nike

据我所知,当我在 IQueryable 上使用 LINQ 扩展方法(使用 lambda 表达式语法)时,它们是 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 被循环等枚举之前,它们都不会访问数据库。 (希望我理解正确)。

但是如果我不将 ObjectSet 掩码为 IQueryable 而是掩码为 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)中完成。正如您想象的那样,这通常是性能 killer 。

我在我的项目中写了简单的测试:

[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();
}

关于c# - 使用 IEnumerable 和 IQueryable 作为 ObjectSet 类型时的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5416375/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com