- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道第一个实现的 LINQ to Entities 和 LINQ to Objects 的一些区别 IQueryable
和第二个工具 IEnumerable
我的问题范围在 EF 5 之内。
我的问题是这 3 种方法的技术差异是什么?我看到在许多情况下它们都有效。我也看到使用它们的组合,如 .ToList().AsQueryable()
.
.ToList().AsQueryable()
而不是 .AsQueryable()
? 最佳答案
关于这一点,有很多话要说。让我专注于AsEnumerable
和 AsQueryable
并提及 ToList()
一路上。
这些方法有什么作用?AsEnumerable
和 AsQueryable
强制转换或转换为 IEnumerable
或 IQueryable
, 分别。我说强制转换或转换是有原因的:
void ReportTypeProperties<T>(T obj)
{
Console.WriteLine("Compile-time type: {0}", typeof(T).Name);
Console.WriteLine("Actual type: {0}", obj.GetType().Name);
}
让我们尝试一个任意的 linq-to-sql
Table<T>
,它实现了
IQueryable
:
ReportTypeProperties(context.Observations);
ReportTypeProperties(context.Observations.AsEnumerable());
ReportTypeProperties(context.Observations.AsQueryable());
结果:
Compile-time type: Table`1
Actual type: Table`1
Compile-time type: IEnumerable`1
Actual type: Table`1
Compile-time type: IQueryable`1
Actual type: Table`1
您会看到表类本身总是被返回,但它的表示会发生变化。
IEnumerable
的对象,不是
IQueryable
:
var ints = new[] { 1, 2 };
ReportTypeProperties(ints);
ReportTypeProperties(ints.AsEnumerable());
ReportTypeProperties(ints.AsQueryable());
结果:
Compile-time type: Int32[]
Actual type: Int32[]
Compile-time type: IEnumerable`1
Actual type: Int32[]
Compile-time type: IQueryable`1
Actual type: EnumerableQuery`1
就是这样。
AsQueryable()
已将数组转换为
EnumerableQuery
,它“将
IEnumerable<T>
集合表示为
IQueryable<T>
数据源。” (MSDN)。
AsEnumerable
经常用于从任何
IQueryable
切换LINQ to objects (L2O) 的实现,主要是因为前者不支持 L2O 具有的功能。更多详情请见
What is the effect of AsEnumerable() on a LINQ Entity? .
var query = context.Observations.Select(o => o.Id)
.AsEnumerable().Select(x => MySuperSmartMethod(x))
ToList
– 转换
IEnumerable<T>
到
List<T>
– 也经常用于此目的。使用优势
AsEnumerable
对比
ToList
是
AsEnumerable
不执行查询。
AsEnumerable
保留延迟执行并且不会构建通常无用的中间列表。
ToList
可以是一种方式来做到这一点。
AsQueryable
可用于使可枚举集合接受 LINQ 语句中的表达式。详情请看这里:
Do i really need use AsQueryable() on collection? .
AsEnumerable
像药物一样起作用。这是一个快速解决方案,但需要付出代价,而且并不能解决根本问题。
AsEnumerable
修复 LINQ 表达式中不受支持的方法的任何问题。但价格并不总是很清楚。例如,如果你这样做:
context.MyLongWideTable // A table with many records and columns
.Where(x => x.Type == "type")
.Select(x => new { x.Name, x.CreateDate })
...所有内容都被巧妙地转换为过滤 (
Where
) 和项目 (
Select
) 的 SQL 语句。也就是说,SQL 结果集的长度和宽度都分别减少了。
CreateDate
的日期部分.在 Entity Framework 中,您会很快发现...
.Select(x => new { x.Name, x.CreateDate.Date })
...不支持(在撰写本文时)。啊,幸好还有
AsEnumerable
使固定:
context.MyLongWideTable.AsEnumerable()
.Where(x => x.Type == "type")
.Select(x => new { x.Name, x.CreateDate.Date })
当然,它可能会运行。但它将整个表拉入内存,然后应用过滤器和投影。好吧,大多数人都足够聪明来做
Where
第一的:
context.MyLongWideTable
.Where(x => x.Type == "type").AsEnumerable()
.Select(x => new { x.Name, x.CreateDate.Date })
但仍然首先获取所有列,并在内存中完成投影。
context.MyLongWideTable
.Where(x => x.Type == "type")
.Select(x => new { x.Name, DbFunctions.TruncateTime(x.CreateDate) })
(但这需要更多的知识......)
context.Observations.AsEnumerable()
.AsQueryable()
你最终会得到表示为
IQueryable
的源对象. (因为这两种方法都只转换而不转换)。
context.Observations.AsEnumerable().Select(x => x)
.AsQueryable()
结果会是什么?
Select
产生
WhereSelectEnumerableIterator
.这是一个内部 .Net 类,它实现了
IEnumerable
,不是
IQueryable
.因此发生了向另一种类型的转换以及随后的
AsQueryable
再也无法返回原始来源。
AsQueryable
是
不是一种神奇地注入(inject)查询提供程序的方法 以其特有的功能成为可枚举的。假设你这样做
var query = context.Observations.Select(o => o.Id)
.AsEnumerable().Select(x => x.ToString())
.AsQueryable()
.Where(...)
where 条件永远不会被翻译成 SQL。
AsEnumerable()
紧随其后的 LINQ 语句明确切断了与 Entity Framework 查询提供程序的连接。
Include
通过调用
AsQueryable
将功能转换为集合.它编译并运行,但它什么也不做,因为底层对象没有
Include
实现了。
AsQueryable
和
AsEnumerable
不要执行(或枚举)源对象。他们只改变他们的类型或表示。都涉及接口(interface),
IQueryable
和
IEnumerable
, 只不过是“等待发生的枚举”。它们在被迫执行之前不会被执行,例如,如上所述,通过调用
ToList()
.
IEnumerable
通过拨打
AsEnumerable
获得在
IQueryable
上对象,将执行底层
IQueryable
.
IEnumerable
的后续执行将再次执行
IQueryable
.这可能非常昂贵。
Queryable.AsQueryable
和
Enumerable.AsEnumerable
扩展方法。但是当然任何人都可以编写具有相同名称(和函数)的实例方法或扩展方法。
AsEnumerable
扩展方法是
DataTableExtensions.AsEnumerable
.
DataTable
不实现
IQueryable
或
IEnumerable
,因此常规扩展方法不适用。
关于entity-framework - .ToList()、.AsEnumerable()、AsQueryable() 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17968469/
平时很少在jquery中用到this。查看代码时发现用到了,就调试出this的值,心想原来如此。还是挺有用的。这里总结一下this与$(this)的区别和使用。 $(this)生成的是什么?
使用单例类和应用程序范围的托管 bean 来保存应用程序数据有区别吗? 我需要查找某些 JNDI 资源,例如远程 bean 接口(interface),因此我为自己编写了一个单例来缓存我的引用并且只允
如果您仔细查看包含的图片,您会注意到您可以使用 Eclipse IDE 重构 Groovy 代码并将方法转换为闭包,反之亦然。那么,闭包到底是什么,它与方法有什么不同呢?有人可以举一个使用闭包的好例子
vagrant box repackage有什么区别( docs ) 和 vagrant package ( docs )? 我意识到 vagrant package仅适用于 VirtualBox 提
我想看看是否有人可以解释为什么以下代码适用于 valueOf 但不适用于其他代码。 import java.math.BigDecimal; public class Change { publ
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: What is Closures/Lambda in PHP or Javascript in layman te
This question already has answers here: Vagrant, Docker, Puppet, Chef (3个答案) 2年前关闭。 docker和chef有什么共同
以下代码在95%的机器上产生相同的输出,但是在几台机器上却有所不同。在 Debug模式下,输出: Changing from New to Fin OK 但在 Release模式下: Changing
////Creating Object var Obj; // init Object Obj= {}; 它们之间有什么区别两个? 有没有可能把它变成一个单行? 这样使用有什么好处吗?
我想找出定时器服务之间的区别。我应该使用哪个以及何时使用。我正在使用 Jboss 应用服务器。 1) java.ejb.Schedule。 @Schedule注解或配置自xml。 2) javax.e
我发现在 C++ 中可以通过三种不同的方式将对象传递给函数。假设我的类(class)是这样的: class Test { int i; public: Test(int x);
有什么区别。 public class Test { public static void main(String args[]) { String toBeCast = "c
如果我有一列,设置为主索引,设置为INT。 如果我不将其设置为自动递增,而只是将唯一的随机整数插入其中,与自动递增相比,这是否会减慢 future 的查询速度? 如果我在主索引和唯一索引为 INT 的
这两种日期格式有什么区别。第一个给出实际时间,第二个给出时间购买添加时区偏移值。 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]
如果有一个函数,请说foo: function foo() { console.log('bar'); } 那么在 JavaScript 中,从另一个函数调用一个函数有什么区别,如下所示: f
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
代码是什么: class Time { private: int hours; int minutes; int seconds; pu
我知道这是非常基本的,但有人介意解释一下这两个数组声明之间的区别吗: #include array myints; ...和: int myints[5]; ...以及为什么 myints.size
我学会了如何根据 http://reference.sitepoint.com/css/specificity 计算 css 特异性但是,基于this reference,我不明白伪类(来自c)和伪元
为什么在运行 2) 时会出现额外的空行?对我来说 1 就像 2。那么为什么 2) 中的额外行? 1) export p1=$(cd $(dirname $0) && pwd) #
我是一名优秀的程序员,十分优秀!