c# - 使用 ToList() 与使用 IList 从存储库返回 IEnumerable

标签 c# asp.net-mvc performance repository-pattern

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 而不是 IEnumerableIQueryable.

因此,我认为与其返回 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/

相关文章:

c# - 优先订阅调用

c# - 在 Entity Framework 中处理存储过程

database - 我应该最大限度地分解关系数据库中的表吗?

asp.net-mvc - Linq/Entity Group 然后计算这些组

linux - 在ubuntu中监视正在运行的程序的指令?

javascript - 您更喜欢哪种方法来测试 Javascript 的速度,为什么?

c# - 根据元素的内容将 JSON 反序列化为不同的元素

c# - 抑制 HTTP_X_FORWARDED_FOR http header ,c# .net C++

c# - XAML DataTemplate 数据绑定(bind)

c# - 使用 Grid.Mvc 发布所有选定的行