2017 年 3 月 31 日更新
自从这篇文章后我又学到了一些东西,所以想给出一个重要的理由在从存储库返回时使用 ToList
- 调用 ToList
将(当使用 IQueryable)在数据库上执行翻译后的 SQL,而不是将记录拉入内存然后进行过滤。我不相信隐式转换为 IEnumerable 或 IList 会这样做。
按照 MSDN 网站上的一些教程,我在我的应用程序中使用了通用存储库层。这个存储层由我的服务层调用,而后者又由 Controller 调用。
查看通用存储库,通过调用 ToList()
获取并返回数据。然而,该方法的返回类型是IEnumerable
,这意味着服务层必须接受IEnumerable
,并且在返回到 Controller 之前它必须再次调用IEnumerable
上的 ToList()
。
示例 - 存储库:
public IEnumerable<TEntity> Get(
Expression<Func<TEntity, bool>> filter = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
string includeProperties = "")
{
IQueryable<TEntity> query = dbSet;
if (filter != null)
{
query = query.Where(filter);
}
foreach (var includeProperty in includeProperties.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
query = query.Include(includeProperty);
}
return orderBy != null ? orderBy(query).ToList() : query.ToList();
}
示例 - 服务层
public IList<DOC> SearchDocuments(string docInfo)
{
// build the predicate and logic, etc
// grab all the matching documents with the relationships
IEnumerable<DOC> documents = _unitOfWork.DocumentRepository.Get(
predicate,
p => p.OrderBy(d => d.DocInfo),
"DocRelationship, DocRelationship.OtherDocTable");
return documents.ToList();
}
从我读过的文章来看,似乎最好只是向 Controller 呈现它需要的对象的 List
而不是 IEnumerable
或 IQueryable
.
因此,我认为与其返回 IEnumerable
不如返回 IList
会更好。我在这里遗漏了什么吗?为什么 MSDN 团队选择 IEnumerable
进行设计并调用 ToList
?这有什么用??在我看来,多次进行这种转换似乎效率低下且毫无意义,尤其是在处理大量数据时。
如果不清楚或已经有答案,我提前道歉,但我一直在搜索和阅读其他帖子 IEnumerable vs IQueryable vs IList,但我仍然不明白这个特定问题。
最佳答案
返回适合您的特定情况的最小接口(interface)。
经常IEnumerable<T>
就足够了,并提供更多的灵 active ,但如果你发现自己需要使用 .ToList()
经常(出于正当理由)返回 IList<T>
甚至 List<T>
.
注释
-
IEnumerable<T>
允许更轻松的惰性评估和单元测试(因为它小于IList
- 所以尽量坚持使用它。 - 您的样本没有显示调用
.ToList()
的正当理由-结合IEnumerable<T>
直到你知道你到底在寻找什么,甚至可能会让你获得更好的性能(即,如果在多次检查后你决定你只需要一个元素,但ToList
将强制你获取 10000)。
关于c# - 使用 ToList() 与使用 IList 从存储库返回 IEnumerable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21447810/