【发布时间】:2011-02-15 20:51:52
【问题描述】:
我想在执行存储过程时得到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(),执行查询代价太大。
【问题讨论】:
-
这是 EF 4 吗?如果是这样,请使用
ExecuteStoreQuery,然后您就不需要Materialize。 -
不,它是 EF 1,但如果
ExecuteStoreQuery解决了我的问题,我会考虑迁移到 EF4。你能分享一些关于那个的特别文章的链接(如果你有的话)。 -
我看到了stackoverflow.com/questions/2201369/…,据说
ExecuteStoreQuery返回ObjectResult集合——与m_Entities.SomeEntitiyStoredProcedure(1234);相同。所以看来ExecuteStoreQuery不能解决我的问题。 -
好的,我明白你在说什么。这 (
Take()...) 是不可能的,因为如果 您 编写 SQL,则 EF 无法进一步编写该 SQL。但是,如果您确实使用ExecuteStoreQuery,那么您可以在您编写的SQL 中使用TOP等。 -
ExecuteStoreQuery返回ObjectResult还是返回ObjectQuery?如果它返回ObjectResult- 它对我来说是不可用的。
标签: .net entity-framework stored-procedures linq-to-entities iqueryable