Car*_*lis 3 .net linq entity-framework compiled-query
正如我们所知,您无法在编译查询中添加.Where()或使用额外的子句.First(),因为这会更改查询并强制重新编译.我想知道的是哪些方法可用于"关闭"编译的查询.
我知道大多数人都使用.AsEnumerable()或者.ToList(),但其他哪些方法也可以使用?我可以使用.AsQueryable(),或者这是一个无操作?
哪个性能更好?我知道.AsEnumerable()速度比快.ToList(),但如果我想要一个IQueryable,那.AsEnumerable().AsQueryable()比它.ToList()好吗?
在大多数情况下,AsEnumerable().AsQueryable()可能是你想要的,因为:
AsEnumerable(),您不会将底层实现的风险AsQueryable()转化为无操作,从而破坏了您关闭查询的尝试.我不是说今天的EF做AsQueryable()了一个无操作(据我所知,它没有),只是行为 - 无操作或透明地调用AsEnumerable() - 没有记录所以依靠它是不安全的.AsEnumerable()ToList()与之不同的是,不会将整个结果集加载到内存中以进行查询.这对于大型结果集非常重要.从理论上讲,对于较小的结果集,使用ToList()可能会有一些优势(例如,优化的ToList()实现从底层提供程序中提取大块数据,而枚举涉及更多上下文切换)但这似乎不太可能且很难依赖于提供者和版本,而AsEnumerable()的大结果集优势将永远存在.我喜欢调用的一种情况ToList()是当我明确地想要强制查询立即执行时.例如,如果我想在方法中先前的查询中捕获错误,以便稍后可以简化错误处理,或者我想在继续查询的其余部分之前验证所有基础数据.或者,如果在切成两半时更容易测试查询.我永远不会这样做,除非我知道我的记录集会很小,因为在数百万行查询中调用ToList()会杀死你的RAM.
要回答您的其他问题,在MSDN上的LINQ文档中转换数据类型详细说明哪些LINQ方法强制执行查询.根据该页面,ToArray(),ToDictionary(),ToList(),和ToLookup()所有的力量查询执行.
相比之下,AsEnumerable()不会强制立即执行查询,而是"关闭"查询(在此使用您的术语,不确定是否有正式的术语).根据http://msdn.microsoft.com/en-us/library/bb335435.aspx:
AsEnumerable方法可用于隐藏自定义方法,而是使标准查询运算符可用.
换句话说,运行AsEnumerable将强制所有调用Take()和Where()使用通用LINQ实现,而不是任何可能导致重新编译的自定义调用.
| 归档时间: |
|
| 查看次数: |
1177 次 |
| 最近记录: |