EF獲取存儲過程多返回結果

在使用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();


到這裏我們就基本完成了獲取存儲過程多返回結果的配置和使用了,根據返回結果的多少配置相應的返回結果類即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章