C# IQueryable的优势<;T>;超过IList<;T>;

C# IQueryable的优势<;T>;超过IList<;T>;,c#,linq,generics,C#,Linq,Generics,在C#DAL中,如果我返回IQueryable而不是IList,我将获得什么优势?我不使用实体框架/N Hibernate,只使用普通的ADO.Net 我认为返回IQueryable允许惰性枚举,而返回IList则不允许 如果返回IList,则在DAL返回IList时对数据库执行查询。返回IQueryable时,可以传递返回信息,并且只有在检查IQueryable的内容时才执行查询 (这是基于我对LINQ to SQL的经验-但我没有根据确定的来源对此进行检查)您应该返回IEnumerable,

在C#DAL中,如果我返回IQueryable而不是IList,我将获得什么优势?我不使用实体框架/N Hibernate,只使用普通的ADO.Net

我认为返回IQueryable允许惰性枚举,而返回IList则不允许

如果返回IList,则在DAL返回IList时对数据库执行查询。返回IQueryable时,可以传递返回信息,并且只有在检查IQueryable的内容时才执行查询


(这是基于我对LINQ to SQL的经验-但我没有根据确定的来源对此进行检查)

您应该返回IEnumerable,而不是IList或IQueryable:

IQueryable使调用者认为他们可以使用延迟求值,并添加过滤器、排序、投影等

IList允许调用方添加、删除、反转、设置值以及修改返回的集合。这对您来说可能不是问题,但是如果您计划在呼叫之间共享数据,那么您需要注意这一点


IEnumerable为调用者提供一个不可变的集合,调用者知道该集合不支持惰性计算

您可以继续查询IQueryable。IQueryable不适用于您的最终返回类型,但适用于构建在原始查询基础上的私人助手-可重用、可组合的查询片段,这些查询在IQueryable中具有基础类型的预期返回类型。

返回IList而不是IQueryable会给您带来什么好处?我很少使用IQueryable,但是在DAL中IQueryable是特定于ORM工具的吗?Linq(例如Linq到SQL)是一个ORM,IQueryable是特定于Linq的接口。值得注意的是,IList是mscorlib的一部分,mscorlib是一个特定于Windows的程序集,而Linq程序集则不是。我有时会想到IQueryable,比如类固醇上的ODBC——这是一个主要的概括,但它帮助我概念化了。林克很了不起。使用Linq,您可以查询SQL Server、Oracle、内存中的对象列表、XML文件,这对调用者没有任何影响。在过去——如果你在内存中有一个员工数据列表,并希望每个部门的薪酬前5名;在使用Linq(IQueryable)之前,您可能会循环整个集合,将salary&department与top进行比较,但现在您编写一个Linq语句并获得IQueryable结果。在我的DAL中,我有对DB的确定调用,因此不会有任何延迟加载,,,我认为我们不应该在基于ADO.Net的自定义DAL中使用IQueryable。我不会从DAL返回IQueryable,但会毫不犹豫地在DAL中使用in(允许多个接口函数使用公共基查询,然后再进行筛选)。事实上,我使用的大多数IEnumerable都是惰性的。是的,我不是指惰性计算。我的意思是IQueryable可以远程完成工作(比如在数据库中),而IEnumerable不能。当然可以。您无法知道在
IEnumerator.MoveNext()中发生了什么