1

我正在为 Linq2Sql 中的数据表准备数据

此代码突出显示为“IEnumerable 的可能多重枚举”(在 Resharper 中)

// filtered is an IEnumerable or an IQueryable

var total = filtered.Count();

var displayed = filtered
                .Skip(param.iDisplayStart)
                .Take(param.iDisplayLength).ToList(); 

我 100% 确定 Resharper 是对的。

我如何重写它以避免警告

为了澄清,我知道我可以在过滤的末尾放置一个 ToList,只对数据库进行一次查询,例如。

 var filteredAndRun = filtered.ToList();

 var total = filteredAndRun.Count();

 var displayed = filteredAndRun
                .Skip(param.iDisplayStart)
                .Take(param.iDisplayLength).ToList(); 

但这会带回比我想通过网络传输的数据多得多的数据。

我期待着我不能吃蛋糕也不能吃。:(

4

2 回答 2

2

听起来您更关心的IQueryable<T>而不是IEnumerable<T>.

但是,在您的情况下,这并不重要。

Count调用应转换为简单且非常快速的 SQL 计数查询。只有第二个查询实际上带回了任何记录。

如果是,IEnumerable<T>那么数据在内存中,无论如何它都会非常快。

我会保持你的代码完全一样,当你发现你有一个重大的性能问题时才担心性能调整。:-)

于 2012-05-21T00:26:58.387 回答
0

你也可以做类似的事情

count = 0;
displayed = new List();
iDisplayStop = param.iDisplayStart + param.iDisplayLength;
foreach (element in filteredAndRun) {
    ++count;
    if ((count < param.iDisplayStart) || (count > iDisplayStop))
          continue;
    displayed.Add(element);
}

显然,这是伪代码,我可能在边缘条件下不一,但该算法仅通过一次迭代即可为您提供计数,并且您仅在最后获得显示项目的列表。

于 2012-12-12T17:30:20.473 回答