如果
IQueryable
接口执行服务器查询表达式,而不是像获取所有IEnumerable
记录,为什么IQueryable
不IEnumerable
替代它可以更快,更高效?IQueryable与IEnumerable:IQueryable总是更好更快?DBSet<T>
有两种口味Where
(IQueryable
和IEnumerable
)。有没有办法调用IEnumerable
版本,因为默认情况下会调用IQueryable
,而不会调用ToList()
?
回答
- 如果
IQueryable
在服务器上而不是 获取像IEnumerable
所有记录进行查询表达式,为什么不IQueryable
取代 通过IEnumerable
它可以更快,更高效?
IQueryable
和IEnumerable
代表两个不同的事情。把IQueryable
想象成一个“问题”,它本身没有任何结果。一个IEnumerable
是一个“答案”,它只有数据连接到它,但你不知道生成的数据是什么。
这并不是说IQueryable
每个说法都“更快”,它只是允许你将你的过滤和预测放到你问SQL服务器的“问题”中,让它只返回它需要的答案(以IEnumerable
的形式通过调用.ToList()
或类似的形式)。
如果您只使用IEnumerable
,那么您可以问的唯一问题是“给我所有你知道的东西”,然后根据它给你的答案进行过滤和投影。这就是为什么IQueryable
被认为更快,因为有更少的数据需要处理,因为你可以向服务器提出更具体的问题。
原因IQueryable
并没有取代IEnumerable
无处不在是因为你问的问题必须能够理解你问的问题。需要很多工作才能解析每个可能的事情,您可以通过它来过滤或投影大多数实现limit themselves to only common things they know they need to be able to answer。例如,在实体框架中,如果您提出的问题不明白如何处理,则会出现类似于的错误“指定的方法不受支持”当您尝试从IQueryable
获得IEnumerable
(答案)时。
DBSet<T>
具有Where
(IQueryable
和IEnumerable
)两种口味。 有没有办法调用IEnumerable
版本,因为默认情况下调用了IQueryable
,而不调用ToList()
?
类DBSet<T>
没有Where method on it at all。两个Where
函数来自两个扩展方法,Enumerable.Where
和Queryable.Where
。在调用扩展方法之前,可以强制它使用Enumerable超载,方法是将对象强制转换为IEnumerable<T>
。不过请记住,Queryable.Where
过滤问题,Enumerable.Where
只过滤结果。
从服务器请求结果然后把它们扔掉是浪费的,所以我不会推荐这样做。
- 1. aoColumnDefs vs fnRowCallback更好更快
- 2. 是否stream.max()总是比stream.reduce()更快?
- 3. 是XmlFormat()总是比htmlEditFormat()更好?
- 4. PHP CURL api是否比HTTP/HTTPS访问使用流更快/更好/更好?
- 5. 这是更好还是更快的方法?
- 6. 使用asp Control总是更好吗?
- 7. C#Interop与C vs Interop与Java:哪个更好/更容易/更快?
- 8. typeof undefined。哪个更快更好?
- 9. 使SQL查询更快更好
- 10. OkHttp更快或更好,HttpUrlsConnection为Android?
- 11. 哪个mysql选择更好/更快?
- 12. 哪种方法更好更快 - Symfony2,Doctrine2
- 13. ParseConfig vs ParseQuery - 哪个更快/更好?
- 14. 更快/更好:取一些与PHP或JavaScript
- 15. NSPredicate与NSString:寻找超弦的哪个更好/更快?
- 16. 更好/更快的方式? java文本冒险与stax
- 17. 在django中,是否聚合(Count())比.count()更快或更好?
- 18. 速度更快/使用更好:MySQL还是PHP md5函数?
- 19. 哪一个是更快/更好的sql练习?
- 20. Android Studio中有更多Android SDK总是更好吗?
- 21. ImageMagick与GD - 哪个速度更快,资源更少,产生更好的图像?
- 22. 更快RSpec与JRuby
- 23. “更好”(更简单,更快,无论)版本'不同的委托'?
- 24. 哪个更快/更好:哪里更新或合并?
- 25. getElementsByTagName(“*”)总是更新?
- 26. 是否使用API总是比刮取更好?
- 27. 使用'DbContext'而不是'ObjectContext'总是更好吗?
- 28. 更新记录Nhibernate和Iqueryable
- 29. JNLP不更新,即使有更新=“总是”政策=“总是”
- 30. 更好的中间件在快速
你的例子(问题和答案)很好,正如我从它理解的那样,'IQueryable'没有用,直到我将它转换为IEnumerable列表才能得到理想的答案 –