gpt4 book ai didi

c# - 如何确定 LINQ 查询是 LINQ to SQL 还是 LINQ to Objects?

转载 作者:行者123 更新时间:2023-12-04 18:30:29 25 4
gpt4 key购买 nike

通常 LINQ to SQL 和 LINQ to Objects 之间的区别不是问题(我认为从一开始就将其作为问题是过早的优化),但是我如何确定发生了什么?

在编写代码时知道会很有用,但我担心有时只能在运行时确定。

最佳答案

区分 Linq-To-Sql 和 Linq-To-Objects 并不是微优化。后者要求在开始过滤之前将所有数据加载到内存中。当然,这可能是一个大问题。

大多数 LINQ 方法使用延迟执行,这意味着它只是构建查询但尚未执行(如 SelectWhere )。很少有人会执行查询并将结果具体化为内存中的集合(如 ToLIstToArray )。如果您使用 AsEnumerable您也在使用 Linq-To-Objects并且后面的部分没有生成SQL,这意味着数据必须加载到内存中(但仍然使用延迟执行)。

因此,请考虑以下两个查询。第一个在数据库中选择和过滤:

var queryLondonCustomers = from cust in db.customers
where cust.City == "London"
select cust;

而第二个选择所有并通过 Linq-To-Objects 过滤:
var queryLondonCustomers = from cust in db.customers.AsEnumerable()
where cust.City == "London"
select cust;

后者有一个优点:您可以使用任何 .NET 方法,因为它不需要转换为 SQL(例如 !String.IsNullOrWhiteSpace(cust.City))。

如果你得到的东西是 IEnumerable<T> ,您无法确定它实际上是查询还是已经是内存中的对象。甚至尝试投向 IQueryable<T>由于 AsQueryable -method,不会确切地告诉您它实际上是什么.也许您可以尝试将其转换为集合类型。如果转换成功,您可以确定它已经实现,否则它不会告诉您它是否正在使用 Linq-To-SqlLinq-To-Objects :
bool isMaterialized = queryLondonCustomers as ICollection<Customer> != null;

相关: EF ICollection Vs List Vs IEnumerable Vs IQueryable

关于c# - 如何确定 LINQ 查询是 LINQ to SQL 还是 LINQ to Objects?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39326746/

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