【问题标题】:C# Entity Framework Multiple ResultsC# 实体框架多个结果
【发布时间】:2019-11-10 15:55:14
【问题描述】:

我正在尝试使用存储过程的多个结果,该过程返回 3 个结果集。

  • 第一个结果是一个名为“消息”的列。
  • 第二个结果集是一个表格
  • 第三个结果集是另一个表

我的主要问题是,关于如何从存储过程处理多个结果集的所有其他示例都意味着每个结果集都可以映射到一个实体,而我的第一个结果并非如此。

第一个结果:

Select @Message

从此查询返回的第二个结果集:

Select SecondId, SecondName 
From T_Table1

从此查询返回的第三个结果集:

Select ThirdId, ThirdName 
From T_Table2

更新 我正在直接更新我的 EDMX,我将包含一个来自 Microsoft 的示例并解释我的问题。

<FunctionImport Name="s_GetAllData">
      <ReturnType EntitySet="CustomerNames" Type="Collection(Model.CustomerName)" />
      <ReturnType EntitySet="CustomerOrders" Type="Collection(Model.CustomerOrder)" />
      <ReturnType EntitySet="CustomerShippings" Type="Collection(Model.CustomerShipping)" />
</FunctionImport>

据此,我需要一个集合类型来引用(这意味着我需要数据库中的一个现有表来反映传入的列)。

您不能将表添加到 EF 模型,除非它具有关键字段,而我的结果中没有。

【问题讨论】:

  • 您的第一个结果仍然是一个实体,其中一个属性定义为 public string Message { get; set; }
  • @entropic 查看我对帖子的更新。

标签: c# entity-framework


【解决方案1】:

我不使用 EDMX 文件,也有很多年没有接触过它们,但这里有一个示例,说明如何使用 POCO 从存储过程调用中使用多个结果集。在下面的示例中,存储过程 dbo.MyProc 有两个 select 语句,假设第一个 select 只是像您的示例中那样选择一个字符串。

using (DbContexts.MyDbContext db = new DbContexts.MyDbContext())
        {
                using (var cmd = db.Database.Connection.CreateCommand())
                {
                    db.Database.Connection.Open();
                    cmd.CommandText = "EXEC dbo.MyProc @param1=@param1";
                    cmd.Parameters.Add(new SqlParameter("@param1", SqlDbType.Int) { Value = 1 });

                    using (var rdr = cmd.ExecuteReader())
                    {
                        using (var objectContext = ((IObjectContextAdapter)db).ObjectContext)
                        {
                            List<string> listSTring = objectContext.Translate<string>(rdr).ToList();
                            rdr.NextResult();
                            List<MyClass> listMyClass = objectContext.Translate<MyClass>(rdr).ToList();
                        }
                    }
                }
        }

【讨论】:

  • 几分钟前我能够使用这种方法得到一些工作,仍然感谢你,我可以将此标记为答案,因为我认为大多数人不喜欢直接编辑 EDMX。跨度>
猜你喜欢
  • 2011-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 1970-01-01
相关资源
最近更新 更多