存储过程返回多个实体集

枚举的默认值,是基础类型的值为0对应的枚举值(如果没有对应的枚举值则默认值为0)

在使用NuGet安装实体框架时,migrate.exe位于下载包的tools文件夹中,在 <项目文件夹>\packages\EntityFramework.<版本>\tools 中
有了 migrate.exe 之后,需要将其复制到包含迁移的程序集位置。

ModeFist方式生成表结构时,在 EF 设计器中,右键单击模型上的空位置,选择“添加代码生成项...”,可以生成DbContext上下文

使用EF调用存储过程放回多个结果集

创建存储过程

CREATE PROCEDURE [dbo].[GetAllBlogsAndPosts] 
 AS 
    SELECT * FROM dbo.Blogs 
    SELECT * FROM dbo.Posts

默认情况下,这个存储过程只会返回Bogs的类型结果

解决方案:

方式一

 1 using (var db = new BloggingContext())
 2 {
 3     // If using Code First we need to make sure the model is built before we open the connection
 4     // This isn‘t required for models created with the EF Designer
 5     db.Database.Initialize(force: false);
 6
 7     // Create a SQL command to execute the sproc
 8     var cmd = db.Database.Connection.CreateCommand();
 9     cmd.CommandText = "[dbo].[GetAllBlogsAndPosts]";
10
11     try
12     {
13
14         db.Database.Connection.Open();
15         // Run the sproc
16         var reader = cmd.ExecuteReader();
17
18         // Read Blogs from the first result set
19         var blogs = ((IObjectContextAdapter)db)
20             .ObjectContext
21             .Translate<Blog>(reader, "Blogs", MergeOption.AppendOnly);
22
23
24         foreach (var item in blogs)
25         {
26             Console.WriteLine(item.Name);
27         }
28
29         // Move to second result set and read Posts
30         reader.NextResult();
31         var posts = ((IObjectContextAdapter)db)
32             .ObjectContext
33             .Translate<Post>(reader, "Posts", MergeOption.AppendOnly);
34
35
36         foreach (var item in posts)
37         {
38             Console.WriteLine(item.Title);
39         }
40     }
41     finally
42     {
43         db.Database.Connection.Close();
44     }
45 }

方式二

通过修改edmx文件文件,将存储过程对应返回的复杂类型修改为指定的实体类型(这种方式在更新模型后会在覆盖)

1.修改edmx对应的xml

 1 <!-- CSDL content -->
 2 <edmx:ConceptualModels>
 3
 4 ...
 5
 6   <FunctionImport Name="GetAllBlogsAndPosts" ReturnType="Collection(BlogModel.GetAllBlogsAndPosts_Result)" />
 7
 8 ...
 9
10   <ComplexType Name="GetAllBlogsAndPosts_Result">
11     <Property Type="Int32" Name="BlogId" Nullable="false" />
12     <Property Type="String" Name="Name" Nullable="false" MaxLength="255" />
13     <Property Type="String" Name="Description" Nullable="true" />
14   </ComplexType>
15
16 ...
17
18 </edmx:ConceptualModels>
19
20 修改成:
21 <FunctionImport Name="GetAllBlogsAndPosts">
22   <ReturnType EntitySet="Blogs" Type="Collection(BlogModel.Blog)" />
23   <ReturnType EntitySet="Posts" Type="Collection(BlogModel.Post)" />
24 </FunctionImport>
25
26
27 <!-- C-S mapping content -->
28 <edmx:Mappings>
29
30 ...
31
32   <FunctionImportMapping FunctionImportName="GetAllBlogsAndPosts" FunctionName="BlogModel.Store.GetAllBlogsAndPosts">
33     <ResultMapping>
34       <ComplexTypeMapping TypeName="BlogModel.GetAllBlogsAndPosts_Result">
35         <ScalarProperty Name="BlogId" ColumnName="BlogId" />
36         <ScalarProperty Name="Name" ColumnName="Name" />
37         <ScalarProperty Name="Description" ColumnName="Description" />
38       </ComplexTypeMapping>
39     </ResultMapping>
40   </FunctionImportMapping>
41
42 ...
43
44 </edmx:Mappings>
45
46 修改成:
47 <ResultMapping>
48   <EntityTypeMapping TypeName ="BlogModel.Blog">
49     <ScalarProperty Name="BlogId" ColumnName="BlogId" />
50     <ScalarProperty Name="Name" ColumnName="Name" />
51     <ScalarProperty Name="Description" ColumnName="Description" />
52   </EntityTypeMapping>
53 </ResultMapping>
54 <ResultMapping>
55   <EntityTypeMapping TypeName="BlogModel.Post">
56     <ScalarProperty Name="BlogId" ColumnName="BlogId" />
57     <ScalarProperty Name="PostId" ColumnName="PostId"/>
58     <ScalarProperty Name="Title" ColumnName="Title" />
59     <ScalarProperty Name="Text" ColumnName="Text" />
60   </EntityTypeMapping>
61 </ResultMapping>

2.执行如下代码

 1 using (var db = new BlogEntities())
 2 {
 3     var results = db.GetAllBlogsAndPosts();
 4
 5     foreach (var result in results)
 6     {
 7         Console.WriteLine("Blog: " + result.Name);
 8     }
 9
10     var posts = results.GetNextResult<Post>();
11
12     foreach (var result in posts)
13     {
14         Console.WriteLine("Post: " + result.Title);
15     }
16
17     Console.ReadLine();
18 }

注意:这两种方式读取实体数据的顺序必须与存储过程中返回的实体顺序一致,否者会报错

 

时间: 2024-08-04 23:47:07

存储过程返回多个实体集的相关文章

[转].net 调用oracle存储过程返回多个记录集

CREATE OR REPLACE PROCEDURE p_query_cs ( p_infotype IN VARCHAR2, p_fromareacode IN VARCHAR2, p_toareacode IN VARCHAR2, p_keytype IN NUMBER, r_cursor1 OUT sys_refcursor, --结果集 r_cursor2 OUT sys_refcursor --结果集 ) IS BEGIN OPEN r_cursor1 FOR SELECT * FR

《Entity Framework 6 Recipes》中文翻译系列 (14) -----第三章 查询之查询中设置默认值和存储过程返回多结果集 (转)

翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-6在查询中设置默认值 问题 你有这样一个用例,当查询返回null值时,给相应属性设置默认值.在我们示例中,当数据库中返回null值时,用‘0’作为YearsWorked属性的默认值. 解决方案 假设你有如图3-7所示的模型,你想通过模型查询employees.在数据库中,代表employees的表包含一可为空的YearsWorked列.该列映射到Employee实体中的YearsWork

Atitit &#160;jdbc 处理返回多个结果集

Atitit  jdbc 处理返回多个结果集 Statement接口提供了三种执行SQL语句的方法: executeQuery.executeUpdate和execute.使用哪一个方法由SQL语句所产生的内容决定. executeQuery   方法用语返回单个结果集 execute方法应该仅在语句能返回多个ResultSet对象.多个更新计数或ResultSet对象与更新计数的组合时使用.当执行某个已存储过程或动态执行未知SQL字符串(即应用程序程序员在编译时未知)时,有可能出现多个结果的情

如何灵活的使用存储过程返回的结果集

在做报表开发时,遇到这样的需求: 当前要开发的报表A,其数据来源于另一张已经开发好的基础报表B. (1)由于统计维度不同,从基础报表B获取的数据需要做进一步的处理. (2)当基础报表B的取数逻辑发生变更时,报表A的取数逻辑也要做相应的变更,保持取数逻辑的一致. 经分析,由于报表A和报表B均为存储过程返回的结果集,实为调用和被调用的关系. 于是问题的关键点转化为:存储过程A该如何调用存储过程B,才能灵活的使用存储过程B返回的结果集. 以下案例中隐去真实的业务场景(甄士隐去,贾雨村言) 首先,我们对

mybatis调用mysql存储过程返回多结果集(完整)

最近,有个开发提了个需求,希望中间件支持调用mysql存储过程时支持多结果集返回,因为某些原因我们使用了不少的存储过程,很多复杂的逻辑目前来看交互非常的多,所以从当前的现状来说,这个需求还是蛮合理的.中午抽空特地搜了下,整合完整示例如下: 1.创建测试存储过程 delimiter $$ CREATE PROCEDURE sp_multi_resultset(IN p_operator_company_no int, IN p_operator_no int, OUT p_error_code v

oracle 存储过程返回结果集

好久没上来了, 难道今天工作时间稍有空闲, 研究了一下oracle存储过程返回结果集. 配合oracle临时表, 使用存储过程来返回结果集的数据读取方式可以解决海量数据表与其他表的连接问题. 在存储过程中先根据过滤条件从海量数据表中选出符合条件的记录并存放到临时中, 可以通过一个视图将临时表与其他相关表连接起来, 从而避免海量数据造成的连接效率问题. 本文只讨论使用存储过程返回结果集. 具体实现如下: -- 启用服务器输出---------------------set serveroutput

C# 通过DataSet 获取SQL 存储过程返回的多个结果集(tables)

测试数据:Northwind 链接地址: https://files.cnblogs.com/files/louiszh/NorthWind.zip 首先创建一个测试存储过程: IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE id = object_id ('pr_test')) DROP PROCEDURE pr_test go CREATE PROCEDURE pr_test AS SELECT TOP 4 * FROM Customers SELECT

oracle存储过程返回结果集

http://www.2cto.com/database/201204/127180.html oracle实现存储过程返回查询结果集合的方法 --实现存储过程返回查询结果集合的方法 ,以下代码来自网络整理 http://topic.csdn.net/u/20090721/12/ba403739-3212-4016-83ec-2a7062f21081.html Java代码 --第一种方法 create or replace Package SYSBasic as  www.2cto.com t

C#获取存储过程返回值和输出参数值的方法

//转自网络,先留个底 1.获取Return返回值 //存储过程 //Create PROCEDURE MYSQL // @a int, // @b int //AS // return @a + @b //GO SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString()); conn.Open(); SqlCommand MyCom