【发布时间】:2013-07-28 16:08:52
【问题描述】:
我有一个这样的界面......
public interface IAccountRepository : IDisposable {
IQueryable<Account> FindByUserId(int userId); //here, Resharper says "Return type can be IEnumerable<Account>"
}
但 Resharper 建议我将其改为 IEnumerable<Account> FindByUserId(int userId)。
为什么会这样?它不会强制将整个对象加载到内存中吗?我认为将执行推迟到真正需要对象时会更好?
【问题讨论】:
-
在你执行
.Count()或.ToList()等方法之前,它不会加载到内存中。 -
这将是因为您的解决方案中没有对
FindByUserId返回的对象使用任何IQueryable<T>方法,因此R# 建议您可以使返回类型更通用。 -
@Pierre-LucPineault IQueryable 允许进一步细化查询 (
.Where...),而无需预先将结果加载到内存中的对象中。显然这不是 IEnumerable 的情况吧? -
@RosdiKasim 你提出了一个很好的观点,我显然没有在我的回答中完全考虑到这一点。但是
Where方法是IEnumerable上的扩展方法无论如何MSDN,所以你仍然没有失去任何权力(即使我不确定如何覆盖扩展方法)。还是我错过了IQuerable的一些内容? -
@Porges 你是对的,我的解决方案中没有使用
IQueryable<T>方法还,但这并不意味着它将来不会被使用,对吧?还是我错过了什么?