Gal*_*you 14 invalidoperationexception linq-to-sql
我正在使用LINQ to SQL在Sql server 2008中获取FullTextSearch存储过程的搜索结果.我将过程从服务器资源管理器拖到设计器,并使用适当的返回类型和参数创建了方法.现在问题是,我需要获取调用此方法的结果的Count,因此使用我的存储库方法(将调用Sproc方法并将结果作为IQueryable返回),我进行以下调用.
var result = repository.FullTextSearch(searchText);
int resultsCount = result.Count();
var ret = result.Skip((pageNumber - 1) * PageSize).Take(PageSize).ToList();
Run Code Online (Sandbox Code Playgroud)
每次我尝试运行它时,此代码都会生成一个InvalidOperationException,异常说(是的,你猜对了!)"查询结果不能多次枚举."
为Sproc生成的方法返回ISingleResult,它应该是OK AFAIK.我需要在我的视图上支持分页,所以我需要知道总页数,如果我能得到所有项目的计数,那么(再次AFAIK)是可能的.
伙计,我在这里想念的是什么?
Ron*_*erg 17
你可以做的是之后添加一个ToList()
电话repository.FullTextSearch(searchText)
.这样,结果将从服务器中检索,之后您可以随意使用它们(因为它们现在已加载到内存中).
你现在要做的是两次运行相同的SQL查询,这是相当低效的.
Mar*_*ell 14
由于这是执行存储过程,所有你的可爱Skip
/ Take
大部分都是多余的...它别无选择,只能将所有数据带回来(存储过程调用是不可组合的).它唯一能做的就是没有实现其中一些对象.
我想知道更好的方法是重构代码来进行两次调用:
int result = repository.FullTextSearchCount(searchText);
var result = repository.FullTextSearch(searchText, skip, take); // or similar
Run Code Online (Sandbox Code Playgroud)
即使分页参数成为SPROC的一部分(以及数据库中的过滤,使用ROW_NUMBER()
/ OVER(...)
或表变量,临时表等) - 或者与OUTPUT
sproc中的参数类似的东西:
int? count = null;
var result = repository.FullTextSearch(searchText, skip, take, ref count);
Run Code Online (Sandbox Code Playgroud)
(我似乎记得,OUTPUT
变ref
,因为TSQL OUTPUT
真是输入+输出)
使用ToList()
可以帮助避免这个问题.
var result = repository.FullTextSearch(searchText).ToList();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
31751 次 |
最近记录: |