实体框架 - 使用存储过程在多个表中获取记录

时间:2009-09-08 08:48:56

标签: c# linq entity-framework

我正在尝试处理实体框架,并且要求通过距离地球上的点的距离来订购结果。我决定previous advice使用我已成功填充视图的存储过程来执行此操作。但是我需要返回多个表,我知道我无法直接使用Entity Framework上的存储过程。如果这不正确,如果有人能告诉我如何做到这一点,我将不胜感激。

无论如何我因此定义了一个简单的sp(SELECT id FROM table),然后想要执行linq查询以将其与模型中的等效对象连接,如下所示:

var sp = db.StoredProcedure();

var ret = from x in db.X
          join y in sp on x.ID equals y.ID
          select x;

但是当我执行此操作时,我得到了以下由查询引起的异常:

“无法创建类型'System.Collections.Generic.IEnumerable'1'的常量值。在此上下文中仅支持原始类型('如Int32,String,Guid'。”

为什么会这样?这是正确的方法吗? (请注意,我的最终sp会更复杂,我将从“select”中的ret返回多个类

2 个答案:

答案 0 :(得分:3)

使用EF扩展程序

EF中非常支持存储过程。即使它们返回实体结果,它们也不提供任何名称映射,因此您必须自己重命名存储过程中的列。

但是。有一个名为Entity Framework Extensions的项目可以使存储过程成为各种不同的场景。

使用EF扩展,您可以以任何方式使用存储过程:

  • 您可以在自定义材质工具中执行列重映射(因此存储过程会返回与数据库中相同的列,而无需将列重命名为实体属性名称)
  • 您可以返回多个结果集(非常适合1:*和关系)
  • 您可以使用标量存储过程甚至是不返回任何内容的过程
  • 您可以使用每行返回多个实体的存储过程的结果(当其中两个实体之间具有1:1的关系时)
  • 您还可以使用输出参数,如果您创建一个执行分页的存储过程(将记录的子集作为实体返回并返回带有总计数的参数),那么这些参数很有用。

你可以做任何事情。我们在一些项目中使用EF Extensions取得了很大的成功。我们为存储过程返回的实体编写了自己的物理化器(基本上是lamba表达式)。然后我们实现了他们的结果。

我认为EF4无论如何都不会支持这个级别的存储过程,因此熟悉EF Extensions总是有价值的。

答案 1 :(得分:0)

.NET 3.5 SP1中的EF无法映射返回标量值的过程(在.NET 4.0中可以)。 SP必须返回实现完整实体所需的所有值,这可能不仅仅是ID。

此外,在LINQ to Entities中使用“join”保留字几乎永远不正确。您可以在客户端模式中遍历关系。

首先编写一个proc,它返回实体类型所需的所有值。映射那个proc。然后做:

IQueryable<MyEntity> q = from e in Context.MyEntities
                         select e;

然后继续前进。