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

.net entity-framework iqueryable linq-to-entities stored-procedures

我想在执行存储过程时获得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() ,执行查询太昂贵了。

一般承认的答案

你无法做你想做的事情,原因与你不能将存储过程放在SELECT查询的FROM子句中的原因相同 - 不构建SQL来支持这种操作。

你能把你想要的逻辑放到视图而不是存储过程吗?


热门答案

您可以使用我创建的名为LinqToAnything的项目,该项目允许您使用不可查询的数据访问方法并将其转换为IQueryable。

我在这里有关于如何使用它的博客文章。




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因