Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq to sql 查询结果不能枚举多次?_Linq To Sql_Invalidoperationexception - Fatal编程技术网

Linq to sql 查询结果不能枚举多次?

Linq to sql 查询结果不能枚举多次?,linq-to-sql,invalidoperationexception,Linq To Sql,Invalidoperationexception,我正在使用LINQtoSQL获取SQLServer2008中FullTextSearch存储过程的搜索结果。我将过程从服务器资源管理器拖到设计器中,并使用适当的返回类型和参数创建了方法。现在的问题是,我需要获取调用此方法的结果计数,因此使用我的repository方法(它将调用存储过程方法并将结果返回为IQueryable)进行以下调用 var result = repository.FullTextSearch(searchText); int resultsCount = r

我正在使用LINQtoSQL获取SQLServer2008中FullTextSearch存储过程的搜索结果。我将过程从服务器资源管理器拖到设计器中,并使用适当的返回类型和参数创建了方法。现在的问题是,我需要获取调用此方法的结果计数,因此使用我的repository方法(它将调用存储过程方法并将结果返回为IQueryable)进行以下调用

var result = repository.FullTextSearch(searchText);
        int resultsCount = result.Count();
        var ret = result.Skip((pageNumber - 1) * PageSize).Take(PageSize).ToList();
每次我尝试运行时,这段代码都会生成一个InvalidOperationException,异常会说(是的,你猜对了!)“查询结果不能枚举多次。”

为存储过程生成的方法返回ISingleResult,该结果应为O.K.AFAIK。我需要在我的视图上支持分页,所以我需要知道总页数,只有当我能够得到所有项目的计数时,才可能知道总页数


伙计们,我错过了什么

您可以做的是在
repository.FullTextSearch(searchText)
之后添加一个
ToList()
调用。通过这种方式,从服务器检索结果,然后您可以对其执行任何您想要的操作(因为它们现在已加载到内存中)


您现在要做的是运行同一个SQL查询两次,这是非常低效的。

因为这是在执行存储过程,所以所有可爱的
跳过
/
执行
都是多余的。。。它别无选择,只能返回所有数据(存储过程调用是不可组合的)。它所能做的唯一事情就是不能为其中一些对象具体化对象

我想知道更好的方法是否是重构代码以进行两次调用:

int result = repository.FullTextSearchCount(searchText);
var result = repository.FullTextSearch(searchText, skip, take); // or similar
i、 e.使分页参数成为存储过程的一部分(以及数据库中的筛选,使用
行数()
/
覆盖(…)
,或表变量、临时表等),或者类似于存储过程中的
输出
参数:

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

(我似乎记得,
OUTPUT
变成了
ref
,因为TSQL
OUTPUT
实际上是输入+输出)

我建议如果需要计数,首先执行结果。然后从列表本身运行计数,因为在结果执行中不使用ResultCount

var result = repository.FullTextSearch(searchText);
var ret = result.Skip((pageNumber - 1) * PageSize).Take(PageSize).ToList();
int resultsCount = ret.Count();
使用
ToList()
可以帮助避免此问题

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

我认为,将整个FTS结果带回来并具体化所有内容比运行两个(但受约束的)查询效率要低得多。我也这么认为。我的意思是,如果我像你建议的那样添加.ToList(),那么我将得到整个搜索结果,这可能是巨大的。我现在不想全部获取,我只想要10个,这就是为什么我要.Skip()ping。我同意将整个结果集带回服务器比执行两个查询效率更低。但是,因为这是一个存储过程调用,所以无论如何都会发生(正如Marc在回答中正确指出的那样)。是的,你说得对,rwwilden,我完全忘记了存储过程结果集是如何产生的。我被纠正了。感谢+1在一次往返中完成计数和页面肯定是最好的解决方案。当然需要对存储过程进行一些重写。完全同意这里的重构部分,但是,现在时间不允许。现在,我想我将向存储库“int FullTextSearchCount()”添加另一个方法。这似乎在我说话的时候起了作用。重构技巧现在就要开始了+1谢谢。这个想法是ResultCount代表结果的总数。是的,Kamal!我需要统计所有结果。不仅仅是我要做的部分。显然,Marc Gravell建议的重构是最好的,goona在我有时间的时候做这件事。我接受马克的回答!再次感谢各位!