为什么DbSet <t> .Where()默认使用IQueryable版本?</t>

时间:2015-03-03 11:32:37

标签: c# linq ef-code-first ienumerable iqueryable

每当我们想使用IEnumerable扩展方法而不是IQueryable版本时,我们都使用AsEnumerable()方法。

var list = context.Details.AsEnumerable().Where(x => x.Code == "A1").ToList();

为什么DbSet在其他版本可用的情况下默认使用IQueryable版本的方法Like(Where,Select,...)?

2 个答案:

答案 0 :(得分:5)

您通常希望使用IQueryable表单,以便在数据库而不是本地进行过滤。

您获得的代码会将所有记录下载到客户端,并在那里对其进行过滤 - 效率极低。只有当您尝试执行无法在数据库中执行的操作时,您才应该使用AsEnumerable() - 通常在提供服务器端过滤器之后。 (你可以在服务器上做一个粗略的过滤器,然后在本地做一个更细粒度的过滤器 - 但至少那时你并没有拉所有记录......)

答案 1 :(得分:2)

因为IQuaryable方法已被实体框架翻译为SQL。但是IEnumerable方法不是。所以如果您使用IEnumearable,则所有数据都将从{DB获取1}}这并不总是你想要的。