【问题标题】:In Entity Framework 6, how to receive an entity as well as associated entities from a stored procedure?在 Entity Framework 6 中,如何从存储过程中接收实体以及关联实体?
【发布时间】:2016-06-04 04:30:04
【问题描述】:

假设我有以下(更复杂的真实情况)CLR 对象:

class Student {
    public int Id {get;set;}
    public int Age {get;set;}
    public string Name {get;set;}
    public ICollection<Grade> Grades {get;set;}
}

class Grade {
    public int Id {get;set;}
    public int Grade {get;set;}
    public string Course {get;set;}      

    public virtual Student Student {get;set;}
    public int StudentId {get;set;}
}

还有以下存储过程:

  SELECT * 
  FROM Students AS S 
  INNER JOIN Grades AS G ON S.Id = G.StudentId

如何从 Entity Framework 执行查询,以使结果值成为 Students 的集合,其中填充了 Grades 集合?

显然,这可以通过使用实体框架实体直接实现,但实际情况要复杂得多,生成的 EF 查询比实现相同查询的存储过程多 100 倍以上的时间。我唯一的问题是当它返回时如何接收数据

【问题讨论】:

    标签: sql entity-framework stored-procedures entity-framework-6


    【解决方案1】:

    只是好奇:存储过程是否导入到您的 EF-DbContext 中? 这个存储过程的结果将是一个复杂的结果,在这种情况下,一个对象包含学生的属性(Id、Age 和 Name)以及 Grade 的属性(Id、Grade、Course、StudentId)。 对于每个 Grade,您将从存储的 proc 中收到一条单独的记录,该记录映射到复杂的结果,即对象。

    为了获取每个学生都有自己的 Grades-Collection 的列表,请对结果对象进行分组,例如

    query = StoredProcResults.GroupBy(res => res.StudentId);
    

    【讨论】:

    • 您的回答假设我已经有一个由强类型实体组成的 StoredProcResults 集合。但是你错过了实际的问题。如何获取存储过程的结果来填充我的 .net 实体?
    • 很抱歉给您带来不便,Guy。在您的 EF 模型中导入存储过程:右键单击设计器,选择“添加”并在下
    • ... 为了在您的 EF 模型中导入存储过程:打开 EF 模型设计器,右键单击设计器,选择“从数据库更新模型”,在“添加”选项卡下“存储过程”选择您的存储过程;确保选中“将选定的存储过程和函数导入实体模型”,单击完成,然后保存这些更改。保存将执行实际的导入。
    • 假设我写的是我的存储过程
    • 在这种情况下,您可以在 DbContext (((IObjectContextAdapter)DbContext).ObjectContext) 的 ObjectContext 上使用 ObjectResult ExecuteStoreQuery(string commandText, params object[] parameters)。 commandText 是存储过程的名称,params 集合包含存储过程的任何参数。 TElement 是您需要将结果映射到的 C# 对象。
    猜你喜欢
    • 2016-03-19
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 2021-01-15
    • 2017-08-18
    • 2020-11-16
    相关资源
    最近更新 更多