【问题标题】:Entity Framework - get records in multiple tables using stored procedure实体框架 - 使用存储过程获取多个表中的记录
【发布时间】:2009-09-08 08:48:56
【问题描述】:

我正在尝试掌握实体框架,并要求按与地球上某个点的距离对结果进行排序。我已经决定previous advice 使用我已成功完成填充视图的存储过程来执行此操作。但是我需要返回多个表,我知道我不能直接使用实体框架上的存储过程来完成。如果这不正确,如果有人能建议我如何做到这一点,我将不胜感激。

无论如何,我因此定义了一个简单的 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'select 返回多个类)

【问题讨论】:

    标签: c# linq entity-framework


    【解决方案1】:

    使用 EF 扩展

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

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

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

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

    你可以做很多事情。我们已经在某个项目中成功使用了 EF 扩展。我们为存储过程返回的实体编写了自己的物化器(基本上是一个 Lamba 表达式)。然后我们实现了他们的结果。

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      然后从那里继续。

      【讨论】:

      • 谢谢克雷格。除非我弄错了,否则我无法将存储过程映射到多个表或视图。我返回的 id 将返回到映射视图中。 “sp”是映射到相应视图的对象。 (我只是正确地或可能错误地只在该视图中包含了 id)然后从该视图中,我试图在我的实体模型中膨胀多个对象,这些对象具有 X 类型的对象。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-06
      • 1970-01-01
      • 2015-11-15
      • 2018-03-24
      • 1970-01-01
      • 2013-05-12
      • 1970-01-01
      相关资源
      最近更新 更多