|
974
|
| stackoverflowuser · 技术社区 · 15 年前 |
|
|
1
1625
是的,两个都会给你 deferred execution .
区别在于
对于
在代码中:
该代码将执行SQL以仅选择黄金客户。另一方面,以下代码将执行数据库中的原始查询,然后过滤掉内存中的非黄金客户:
这是一个非常重要的区别,正在努力
|
|
|
2
244
最上面的答案是好的,但它没有提到解释两个接口“如何”不同的表达式树。基本上,有两组相同的LINQ扩展。
您可能一直在使用这两种方法而没有意识到这一点,因为它们都是使用相同的语法来调用的:
例如
为什么要麻烦这个表达树的事情?我只是想要
哦,这听起来像是免费的性能提升,我应该使用吗
|
|
3
68
是的,两者都使用延迟执行。让我们用SQL Server事件探查器来说明区别…. 当我们运行以下代码时:
在SQL Server Profiler中,我们发现一个命令等于:
对一个有100万条记录的weblog表运行该代码块大约需要90秒。 因此,所有表记录都作为对象加载到内存中,然后在每个.where()中,它将是内存中针对这些对象的另一个过滤器。
当我们使用
在SQL Server Profiler中,我们发现一个命令等于:
运行此代码块大约需要4秒钟,使用
IQueryable有一个名为
|
|
4
54
两个都会让你延期执行,是的。 至于哪个比另一个更受欢迎,这取决于基础数据源是什么。
返回一个
返回一个
|
|
|
5
26
一般而言,我建议如下:
想象一个
|
|
|
6
23
通常,您希望保留查询的原始静态类型,直到它变得重要为止。
因此,您可以将变量定义为“var”,而不是
如果你从一开始
将类型从
|
|
7
20
前面已经说过很多,但要回到根源上来,用一种更技术的方式:
它们显然有不同的含义。
现在,这些表达式是如何执行的,以及它们变成什么,都取决于所谓的查询提供者(我们可以认为是表达式执行者)。
在
Entity Framework
世界(即神秘的基础数据源提供程序或查询提供程序)
基本上,
仿佛
推迟
执行这是一个
两者的正确使用在很大程度上取决于您在特定情况下所面临的任务。对于众所周知的存储库模式,我个人选择返回
有点混乱:(来自评论中的讨论) 它们中没有一个是内存中的对象,因为它们本身不是真正的类型,它们是类型的标记——如果你想深入了解的话。但这是有道理的(这就是为什么 MSDN 这样说)将IEnumerable视为内存集合,而iqueryables则视为表达式树。重点是iQuery接口继承了IEnumerable接口,因此如果它表示一个查询,则可以枚举该查询的结果。枚举导致执行与IQueryable对象关联的表达式树。 因此,实际上,如果没有内存中的对象,就不能真正调用任何IEnumerable成员。如果你这样做,不管怎样,如果它不是空的,它会进入那里。iqueryables只是查询,而不是数据。 |
|
|
8
17
有一篇博文简要介绍了如何滥用
如果我们更深入地挖掘并深入研究这些资源,我们可以看到,有明显不同的扩展方法被用于
和
第一个返回可枚举迭代器,第二个通过查询提供程序创建查询,在中指定
|
|
9
10
我最近遇到一个问题
我对实体的ef和linq还比较陌生,所以花了一段时间才弄清楚瓶颈是什么。使用微型分析,我找到了查询,然后将所有单个操作转换为单个操作
试着用iqueryables作为经验法则,对你的工作进行分析,使你的变化是可测量的。 |
|
|
10
9
我想澄清一些事情,由于似乎冲突的反应(主要围绕IEnumerable)。
(1)
(2)二者兼而有之
换言之,
样品使用案例
(a)检索记录列表
(b)通过
(C)迭代并从视图访问数据集的记录、子实体和属性。(可能导致例外!) 可能的问题
(1)
(2)实体框架实体代理已启用(默认),并且您尝试访问具有过期数据上下文的相关(虚拟)对象。与(1)相同。
(3)多个活动结果集(mars)。如果您正在迭代
解决方案
通过调用执行查询并存储结果
在您访问相关实体的情况下,您可能仍然需要数据上下文。或者您可以禁用实体代理并显式地
|
|
|
11
9
|
|
|
12
8
__IEnumerable_157;和_156;iqueryable_157;之间的主要区别在于执行过滤器逻辑的位置。一个在客户端(内存中)执行,另一个在数据库上执行。 例如,我们可以考虑这样一个例子:在我们的数据库中,一个用户有10000条记录,假设只有900条记录是活动用户,所以在本例中,如果我们使用IEnumerable,那么首先它将在内存中加载所有10000条记录,然后对其应用isactive过滤器,最后返回900个活动用户。 另一方面,同样的情况下,如果我们使用iqueryable,它将直接在数据库上应用isactive过滤器,直接从数据库返回900个活动用户。 参考文献 Link |
|
13
4
我们可以以相同的方式使用这两种方法,而且它们在性能上只是不同的。 iqueryable只以有效的方式对数据库执行。这意味着它创建了一个完整的select查询,只获取相关的记录。
例如,我们希望
前10名
以“nimal”开头的客户。在这种情况下,选择查询将生成为
但是如果我们使用IEnumerable,那么查询应该是
|
|
|
14
4
除了前2个非常好的答案(由Dris和Jacob提供):
IEnumerable对象表示内存中的一组数据,只能向前移动此数据。IEnumerable对象表示的查询被立即完全执行,因此应用程序可以快速接收数据。 执行查询时,IEnumerable将加载所有数据,如果需要对其进行筛选,则筛选本身在客户端完成。
IQueryable对象提供对数据库的远程访问,并允许您以从开始到结束的直接顺序或相反的顺序浏览数据。在创建查询的过程中,返回的对象是IQueryable,对查询进行了优化。因此,在执行过程中消耗的内存更少,网络带宽更少,但同时,它的处理速度比返回IEnumerable对象的查询稍慢。 选择什么? 如果您需要整个返回的数据集,那么最好使用IEnumerable,它提供了最大的速度。 如果您不需要整个返回数据集,而只需要一些过滤后的数据,那么最好使用iqueryable。 |
|
|
15
-2
IEnumrable将数据存储到内存中 但如果是iqueuable,它不会存储在内存中。 有关详细信息,请使用SQL事件探查器进行检查 第一次击中你 使用iQueryable查询 并查看执行的查询 然后尝试从IEnumable |