EF获取存储过程多返回结果

原创 2016年08月29日 17:37:19

在使用EF来获取存储过程结果时,当存储过程返回一个结果,那么我们可以使用生成的返回结果类即可,当返回多结果时,自动生成的就不够使用了,这时我们需要对生成的EF中xml文件进行配置。

环境要求:EF版本要求 5.0以上,项目的 .NET Framework 需要4.5以上。

配置:

1、找到函数导入配置项 FunctionImport,如下为自动生成的配置

  <FunctionImport Name="functionname" ReturnType="Collection(EFeModel.model)">
            <Parameter Name="flag" Mode="In" Type="Int32" />
            <Parameter Name="name" Mode="In" Type="varchar" />
          </FunctionImport>

将以上配置更改为如下,及将存储过程生返回的多结果类型依次配置导入

  <FunctionImport Name="<span style="font-family: Arial, Helvetica, sans-serif;">functionname</span>" >
            <ReturnType Type="Collection(<span style="font-family: Arial, Helvetica, sans-serif;">EFeModel</span>.School)"/>
            <ReturnType Type="Collection(<span style="font-family: Arial, Helvetica, sans-serif;">EFeModel</span>.Class)"/>
            <ReturnType Type="Collection(<span style="font-family: Arial, Helvetica, sans-serif;">EFeModel</span>.Student)"/>
            <Parameter Name="flag" Mode="In" Type="Int32" />
            <Parameter Name="name" Mode="In" Type="varchar" />
   </FunctionImport>

2、将ComplexType配置项增加相应的类型配置,如下

  <ComplexType Name="<span style="font-family: Arial, Helvetica, sans-serif;">School</span>">
          <Property Type="String" Name="name" Nullable="true" MaxLength="20" />
          <Property Type="Int32" Name="count" Nullable="true" />
          <Property Type="Decimal" Name="play" Nullable="true" Precision="38" Scale="2" />
        </ComplexType>
        <ComplexType Name="<span style="font-family: Arial, Helvetica, sans-serif;">Class</span>">
          <Property Type="String" Name="name" Nullable="true" MaxLength="20" />
          <Property Type="Int32" Name="count" Nullable="true" />
          <Property Type="Decimal" Name="play" Nullable="true" Precision="38" Scale="2" />
        </ComplexType>
        <ComplexType Name="<span style="font-family: Arial, Helvetica, sans-serif;">Student</span>">
          <Property Type="String" Name="name" Nullable="true" MaxLength="20" />
          <Property Type="Int32" Name="count" Nullable="true" />
          <Property Type="Decimal" Name="play" Nullable="true" Precision="38" Scale="2" />
        </ComplexType>


3、在结果集映射FunctionImportMapping中增加相应的返回结果类型映射,如下

   <ResultMapping>
              <ComplexTypeMapping TypeName="<span style="font-family: Arial, Helvetica, sans-serif;">EFeModel</span><span style="font-family: Arial, Helvetica, sans-serif;">.School</span>">
                <ScalarProperty Name="name" ColumnName="name" />
                <ScalarProperty Name="count" ColumnName="count" />
                <ScalarProperty Name="play" ColumnName="play" />
              </ComplexTypeMapping>
            </ResultMapping>
            <ResultMapping>
              <ComplexTypeMapping TypeName="<span style="font-family: Arial, Helvetica, sans-serif;">EFeModel</span><span style="font-family: Arial, Helvetica, sans-serif;">.Class</span>">
                <ScalarProperty Name="name" ColumnName="name" />
                <ScalarProperty Name="count" ColumnName="count" />
                <ScalarProperty Name="play" ColumnName="play" />
              </ComplexTypeMapping>
            </ResultMapping>
            <ResultMapping>
              <ComplexTypeMapping TypeName="<span style="font-family: Arial, Helvetica, sans-serif;">EFeModel</span><span style="font-family: Arial, Helvetica, sans-serif;">.Student</span><span style="font-family: Arial, Helvetica, sans-serif;">"></span>
                <ScalarProperty Name="name" ColumnName="name" />
                <ScalarProperty Name="count" ColumnName="count" />
                <ScalarProperty Name="paly" ColumnName="play" />
              </ComplexTypeMapping>
            </ResultMapping>


4、配置修改完毕,保存即可。那么接下来就看看在程序中如何获取这些多个返回结果

  //获取School
                var list = db.functionname(flag, name);
                model.School= list.Select(a => new School()
                {
                    Name = a.Name,
                    Play= a.Play,
                    Count = a.Count
                }).ToList();

                //获取Class
                var list1 = list.GetNextResult<functionname>();
                model.Class= list1.Select(a => new Class()
                {
                    Name = a.Name,
                  <span style="font-family: Arial, Helvetica, sans-serif;">Count= a.Count,</span><pre name="code" class="csharp">                    Play= a.Play
}).ToList(); //获取Student var list2 = list1.GetNextResult<functionname>(); model.Student= list2.Select(a => new Student() { Name = a.Name, Count= a.Count, Play= a.Play }).ToList();



到这里我们就基本完成了获取存储过程多返回结果的配置和使用了,根据返回结果的多少配置相应的返回结果类即可。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

EntityFramework存储过程的返回类型

使用EntityFramework可以很方便的与数据库打交道,但是对于存储过程,返回类型很让人纠结,默认只返回受影响的行数,而我们在使用存储过程时往往是会返回一串的数据或者一个表。那有没有什么方法呢?...

EF中执行存储过程,获取output返回值

EF不能直接支持执行存储过程,于是使用转化成执行SQL语句的形式,却怎么也获取不到output的值,折腾的好久,终于解决了,分享下曲折的经历: public int AddVote(int titl...

如果存储过程返回多个结果集,怎么取结果

//方式一:使用SqlDataAdapter SqlDataAdapter sda = new SqlDataAdapter(); DataSet ds...

java调用存储过程同时获取[返回参数]和[结果集]

来源:http://blog.csdn.net/security08/article/details/5148586 执行以下代码,报错: String querySQL = "{?=call p...
  • gqltt
  • gqltt
  • 2013年03月04日 09:50
  • 851

C#获取一个即返回结果集,又返回值的存储过程

C#获取一个即返回结果集,又返回值的存储过程

PHP调用MsSQL Server 2012存储过程获取多结果集(包含output参数)

【PHP Source Code】:$dbh = new PDO('sqlsrv:server=连接地址;Database=数据库名', 用户名, 密码); try { $procName = "P...

MVC+EF+ 存储过程的小案例

  • 2017年11月16日 10:07
  • 6.66MB
  • 下载

OCCI调用带有返回结果集的存储过程,获取结果集中指定列的值

//用到的带有返回结果记录集的存储过程 create or replace procedure recordset(p_cur in out sys_refcursor,sno in int) a...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:EF获取存储过程多返回结果
举报原因:
原因补充:

(最多只允许输入30个字)