我希望在执行存储过程时得到IQueryable<>
结果。
以下代码的和平工作正常:
IQueryable<SomeEntitiy> someEntities;
var globbalyFilteredSomeEntities =
from se in m_Entities.SomeEntitiy
where
se.GlobalFilter == 1234
select se;
我可以使用它来应用全局过滤器,然后以这种方式使用结果
result = globbalyFilteredSomeEntities
.OrderByDescending(se => se.CreationDate)
.Skip(500)
.Take(10);
我想做什么 - 在全局过滤器中使用一些存储过程 我试过了:
将存储过程添加到m_Entities
,但它返回IEnumerable<>
并立即执行sp:
var globbalyFilteredSomeEntities =
from se in m_Entities.SomeEntitiyStoredProcedure(1234);
使用EFExtensions库实现查询,但它是IEnumerable<>
如果我使用AsQueryable()
和OrderBy()
,Skip()
,Take()
然后在ToList()
之后执行该查询 -
我得到DataReader
开放的异常,我需要先关闭它(不能粘贴错误 - 这是俄语)。
var globbalyFilteredSomeEntities =
m_Entities.CreateStoreCommand("exec SomeEntitiyStoredProcedure(1234)")
.Materialize<SomeEntitiy>();
//.AsQueryable()
//.OrderByDescending(se => se.CreationDate)
//.Skip(500)
//.Take(10)
//.ToList();
同样只是跳过.AsQueryable()
没有用 - 同样的例外
当我执行ToList()
查询时,执行
但是在没有Skip()
,Take()
的情况下执行查询太昂贵了。
答案 0 :(得分:8)
您无法执行您尝试执行的操作,原因与您无法将存储过程放在SELECT查询的FROM子句中相同 - SQL不是为支持此类操作而构建的。
您可以将所需的逻辑放入视图而不是存储过程吗?
答案 1 :(得分:1)
您可以使用我创建的名为LinqToAnything的项目,该项目允许您使用不可查询的数据访问方法并将其转换为IQueryable。
我有关于如何使用它的博文here。
答案 2 :(得分:-3)
sually你可以用ToList()
解决这些问题var globbalyFilteredSomeEntities = m_Entities.CreateStoreCommand("exec SomeEntitiyStoredProcedure(1234)")
.Materialize<SomeEntitiy>()
.ToList() // <<-- added this.
.WhateverYouWant();
为什么你不能对可枚举的Skip()和Take()做?执行此操作只会下载跳过或拍摄的结果,其他结果将不会被读取。
编辑:以前的版本在很多方面都是错误的。