您的位置:首页 > 数据库

[代码]如何使用为多个结果形状映射的存储过程(LINQ to SQL)

2010-10-22 00:26 561 查看
有一种存储过程,它返回的结果形状是不确定的,可能会根据所传递的参数不同,而返回不同的结果形状。
比如下面的这个存储过称。
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参数值一致,否则就可能产生错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐