查询结果不能枚举不止一次?(The query results cannot be enumerat

2019-07-04 05:58发布

我使用LINQ到SQL来获得SQL Server 2008中一个FullTextSearch存储过程的搜索结果我拖着程序从服务器资源管理器的设计,并得到了与相应的返回类型和参数创建的方法。 现在的问题是,我需要调用此方法的结果的算的,所以用我的库法(这将调用存储过程的方法,并返回结果为IQueryable的),我提出以下电话。

var result = repository.FullTextSearch(searchText);
        int resultsCount = result.Count();
        var ret = result.Skip((pageNumber - 1) * PageSize).Take(PageSize).ToList();

此代码生成一个InvalidOperationException每个我尝试运行它时,除了说(是的,你猜对了!)“的查询结果不能枚举不止一次。”

这是该存储过程中产生的方法返回ISingleResult这应该是OK AFAIK。 我需要支持我的观点分页,所以我需要知道的页面,(据我所知再次)仅仅是可能的,如果我能得到的所有项目的计数的总数。

缺少什么我在这里,你们?

Answer 1:

由于这是执行一个存储过程,你的所有可爱的Skip / Take在很大程度上是多余反正...它没有选择,只能将所有的数据备份(存储过程调用非组合的)。 它可以做的唯一的事情是不是他们中的一些具体化的对象。

我不知道更好的方法是重构代码,使两个调用:

int result = repository.FullTextSearchCount(searchText);
var result = repository.FullTextSearch(searchText, skip, take); // or similar

即使SPROC的寻呼参数部分(以及在该数据库中的滤波,使用ROW_NUMBER() / OVER(...)或表的变量,TEMP-表,等) -或可替换地与类似的东西OUTPUT参数在存储过程:

int? count = null;
var result = repository.FullTextSearch(searchText, skip, take, ref count);

(I似乎记得, OUTPUT变为ref ,由于TSQL OUTPUT是真的输入输出+)



Answer 2:

你可以做的就是添加一个ToList()后调用repository.FullTextSearch(searchText) 这样一来,结果从服务器,之后你可以与他们任何你想要的(因为他们现在在内存中加载)做检索。

你所想现在要做的是运行相同的SQL查询两次,这是相当低效。



Answer 3:

使用ToList()可以帮助避免这个问题。

var result = repository.FullTextSearch(searchText).ToList();


Answer 4:

我建议,如果你需要的数量,首先执行的结果。 然后运行从列表本身的数量,因为你没有在你的结果执行使用resultsCount。

var result = repository.FullTextSearch(searchText);
var ret = result.Skip((pageNumber - 1) * PageSize).Take(PageSize).ToList();
int resultsCount = ret.Count();


文章来源: The query results cannot be enumerated more than once?