IQueryable的<>来自存储过程(实体框架)

时间:2010-05-05 10:20:44

标签: .net entity-framework stored-procedures linq-to-entities iqueryable

我希望在执行存储过程时得到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()的情况下执行查询太昂贵了。

3 个答案:

答案 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()做?执行此操作只会下载跳过或拍摄的结果,其他结果将不会被读取。

编辑:以前的版本在很多方面都是错误的。