有一种存储过程,它返回的结果形状是不确定的,可能会根据所传递的参数不同,而返回不同的结果形状。
比如下面的这个存储过称。
CREATE PROCEDURE VariableResultShapes(@Shape int)
AS
if(@Shape = 1)
select CustomerID, ContactTitle, CompanyName from Customers
else if(@Shape = 2)
select OrderID, ShipName from Orders
很明显当@Shape的值为1和2的时候,其返回的结果形状是完全不同的,一个返回的客户的3列数据,而一个返回的是订单的3列的数据。
这个代码就是来看如何为这种存储过程生成映射,并且如何使用这样的函数来获取数据。
首先定义一个存储过程,就使用前面的那个SQL语句。
接着,就是根据这个存储过程,创建映射函数了。不过在这之前,首先得要为不同的结果形状生成两个不同的实体类,也就是所谓的投影形状。定义如下:
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(CustomerResult))]
[ResultType(typeof(OrderResult))]
public IMultipleResults VariableResultShapes(
[Parameter(Name = "Shape", DbType = "Int")] System.Nullable<int> shape)
{
IExecuteResult result = this.ExecuteMethodCall(this,
((MethodInfo)(MethodInfo.GetCurrentMethod())), shape);
return ((IMultipleResults)(result.ReturnValue));
}
可以使用类似如下的代码调用这种映射函数来访问数据:
NorthwindDataContext db = new NorthwindDataContext(@"C:/LINQ/Northwind.mdf");
Console.WriteLine("Customers:");
IMultipleResults Results = db.VariableResultShapes(1);
foreach (var CustomerObject in Results.GetResult<CustomerResult>())
{
Console.WriteLine("CustomerID={0} ContactTitle={1}",
CustomerObject.CustomerID,
CustomerObject.ContactTitle);
Thread.Sleep(50);
}
Console.WriteLine();
Console.WriteLine("Orders:");
Results = db.VariableResultShapes(2);
foreach (var OrderObject in Results.GetResult<OrderResult>())
{
Console.WriteLine("OrderID={0} ShipName={1}",
OrderObject.OrderID,
OrderObject.ShipName);
Thread.Sleep(50);
}
需要注意的是:为GetResult指定元素类型时,务必要与所传递的@Shape参数值一致,否则就可能产生错误。