Instrukcje: Używanie procedur składowanych zmapowanych do wielu kształtów wyników
Gdy procedura składowana może zwracać wiele kształtów wyników, zwracany typ zwracany nie może być silnie typowany do jednego kształtu projekcji. Mimo że linQ to SQL może wygenerować wszystkie możliwe typy projekcji, nie może znać kolejności ich zwracania.
Porównaj ten scenariusz z procedurami składowanymi, które tworzą sekwencyjnie wiele kształtów wyników. Aby uzyskać więcej informacji, zobacz How to: Use Stored Procedures Mapped for Sequential Result Shapes (Instrukcje: używanie procedur składowanych mapowanych na kształty wyników sekwencyjnych).
Atrybut ResultTypeAttribute jest stosowany do procedur składowanych, które zwracają wiele typów wyników w celu określenia zestawu typów, które procedura może zwrócić.
Przykład 1
W poniższym przykładzie kodu SQL kształt wyniku zależy od danych wejściowych (shape =1
lub shape = 2
). Nie wiesz, które projekcje zostaną zwrócone jako pierwsze.
CREATE PROCEDURE VariableResultShapes(@shape int)
AS
if(@shape = 1)
select CustomerID, ContactTitle, CompanyName from customers
else if(@shape = 2)
select OrderID, ShipName from orders
[Function(Name="dbo.VariableResultShapes")]
[ResultType(typeof(VariableResultShapesResult1))]
[ResultType(typeof(VariableResultShapesResult2))]
public IMultipleResults VariableResultShapes([Parameter(DbType="Int")] System.Nullable<int> shape)
{
IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), shape);
return ((IMultipleResults)(result.ReturnValue));
}
<FunctionAttribute(Name:="dbo.VariableResultShapes"), _
ResultType(GetType(VariableResultShapesResult1)), _
ResultType(GetType(VariableResultShapesResult2))> _
Public Function VariableResultShapes(<Parameter(DbType:="Int")> ByVal shape As System.Nullable(Of Integer)) As IMultipleResults
Dim result As IExecuteResult = Me.ExecuteMethodCall(Me, CType(MethodInfo.GetCurrentMethod, MethodInfo), shape)
Return CType(result.ReturnValue, IMultipleResults)
End Function
Przykład 2
Aby wykonać tę procedurę składowaną, użyj kodu podobnego do poniższego.
Uwaga
Należy użyć GetResult wzorca, aby uzyskać moduł wyliczający poprawnego typu na podstawie wiedzy na temat procedury składowanej.
Northwnd db = new Northwnd(@"c:\northwnd.mdf");
// Assign the results of the procedure with an argument
// of (1) to local variable 'result'.
IMultipleResults result = db.VariableResultShapes(1);
// Iterate through the list and write results (the company names)
// to the console.
foreach(VariableResultShapesResult1 compName in
result.GetResult<VariableResultShapesResult1>())
{
Console.WriteLine(compName.CompanyName);
}
// Pause to view company names; press Enter to continue.
Console.ReadLine();
// Assign the results of the procedure with an argument
// of (2) to local variable 'result'.
IMultipleResults result2 = db.VariableResultShapes(2);
// Iterate through the list and write results (the order IDs)
// to the console.
foreach (VariableResultShapesResult2 ord in
result2.GetResult<VariableResultShapesResult2>())
{
Console.WriteLine(ord.OrderID);
}
Dim db As New Northwnd("c:\northwnd.mdf")
' Assign the results of the procedure with an argument
' of (1) to local variable 'result'.
Dim result As IMultipleResults = db.VariableResultShapes(1)
' Iterate through the list and write results (the company name)
' to the console.
For Each compName As VariableResultShapesResult1 _
In result.GetResult(Of VariableResultShapesResult1)()
Console.WriteLine(compName.CompanyName)
Next
' Pause to view company names; press Enter to continue.
Console.ReadLine()
' Assign the results of the procedure with an argument
' of (2) to local variable 'result.'
Dim result2 As IMultipleResults = db.VariableResultShapes(2)
' Iterate through the list and write results (the order IDs)
' to the console.
For Each ord As VariableResultShapesResult2 _
In result2.GetResult(Of VariableResultShapesResult2)()
Console.WriteLine(ord.OrderID)
Next