在使用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>
<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();
到這裏我們就基本完成了獲取存儲過程多返回結果的配置和使用了,根據返回結果的多少配置相應的返回結果類即可。