IQueryable与IEnumerable:IQueryable是否总是越来越好? [英] IQueryable vs IEnumerable: is IQueryable always better and faster?

查看:61
本文介绍了IQueryable与IEnumerable:IQueryable是否总是越来越好?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  1. 如果IQueryable接口在服务器中执行查询表达式,而不是像IEnumerable那样获取所有记录,为什么IQueryable不能用IEnumerable代替,因为它可以更快,更高效? /p>

  2. DBSet<T>具有Where的两种风格(IQueryableIEnumerable).是否可以调用IEnumerable版本,因为默认情况下会调用IQueryable而不调用ToList()?

解决方案

  1. 如果IQueryable而是在服务器中执行查询Expression 而不是像IEnumerable这样提取所有记录,为什么IQueryable不这样 替换为IEnumerable哪里可以更快,更高效?

IQueryableIEnumerable代表两个不同的事物.将IQueryable视为问题",它本身没有任何结果. IEnumerable是一个答案",它仅连接了数据,但是您无法确定是什么原因产生了该数据.

并不是说IQueryable可以说更快",它只是允许您将过滤和预测放入您向SQL Server提出的问题"中,并使其仅返回所需的答案. (通过调用.ToList()或类似形式以IEnumerable的形式).

如果仅使用IEnumerable,则您可以问的唯一问题是给我您所知道的一切",然后根据答案进行过滤和投影.这就是为什么IQueryable被认为更快的原因,因为您能够向服务器提出更具体的问题,因此需要处理的数据更少.

IQueryable不能在所有地方替换IEnumerable的原因是因为您要提出问题的事物必须能够理解您所提出的问题.要解析所有可能要过滤或投影在所有实现上的可能事情,需要花费大量的工作,因此大多数实现的错误. (答案).

  1. DBSet<T>具有Where的两种风格(IQueryableIEnumerable). 有没有办法调用IEnumerable版本,因为 默认情况下会调用IQueryable,而不会调用ToList()?

DBSet<T>没有其中的方法完全可以.这两个Where函数来自两个扩展方法, Enumerable.Where 解决方案

  1. If the IQueryable perform the query Expression in the server rather than fetching all records like IEnumerable, why IQueryable not replaced by IEnumerable where it can be faster and more efficient?

IQueryable and IEnumerable represent two different things. Think of a IQueryable as a "question", it does not have any results itself. A IEnumerable is an "answer", it only has data connected to it but you can't tell what generated that data.

It is not that a IQueryable is "faster" per say, it just allows you to put your filtering and projections in to the "question" you ask to the SQL server and let it return only the answers it needs to (In the form of a IEnumerable by calling .ToList() or similar).

If you only use a IEnumerable the only question you can ask is "Give me everything you know" then on the answer it gives you you perform your filtering and projections. That is why IQueryable is considered faster, because there is a lot less data that needs to be processed because you where able to ask a more specific question to the server.

The reason IQueryable has not replaced IEnumerable everywhere is because the thing you are asking a question has to be able to understand the question you are asking it. It takes a lot of work to be able to parse every possible thing you could ask it to filter or project on so most implementations limit themselves to only common things they know they need to be able to answer. For example in Entity Framework when you ask a question it does not understand how to handle you will get a error that says something similar to "Specified method is not supported" when you try to get a IEnumerable (an answer) from the IQueryable.

  1. DBSet<T> has two flavors of Where (IQueryable and IEnumerable). is there a way to call the IEnumerable version because the IQueryable is called by default, without calling ToList()?

The class DBSet<T> has no Where method on it at all. The two Where functions come from two extension methods, Enumerable.Where and Queryable.Where. You can force it to use the Enumerable overload by casting the object to a IEnumerable<T> before you call the extension method. However do remember, Queryable.Where filters the question, Enumerable.Where only filters the result.

It is wasteful to ask for results from the server to then just throw them away, so I would not recommend doing this.

这篇关于IQueryable与IEnumerable:IQueryable是否总是越来越好?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆