我使用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。 我需要支持我的观点分页,所以我需要知道的页面,(据我所知再次)仅仅是可能的,如果我能得到的所有项目的计数的总数。
缺少什么我在这里,你们?
由于这是执行一个存储过程,你的所有可爱的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
是真的输入输出+)
你可以做的就是添加一个ToList()
后调用repository.FullTextSearch(searchText)
这样一来,结果从服务器,之后你可以与他们任何你想要的(因为他们现在在内存中加载)做检索。
你所想现在要做的是运行相同的SQL查询两次,这是相当低效。
使用ToList()
可以帮助避免这个问题。
var result = repository.FullTextSearch(searchText).ToList();
我建议,如果你需要的数量,首先执行的结果。 然后运行从列表本身的数量,因为你没有在你的结果执行使用resultsCount。
var result = repository.FullTextSearch(searchText);
var ret = result.Skip((pageNumber - 1) * PageSize).Take(PageSize).ToList();
int resultsCount = ret.Count();