[代码]如何使用为多个结果形状映射的存储过程(LINQ to SQL)
2010-10-22 00:26
561 查看
有一种存储过程,它返回的结果形状是不确定的,可能会根据所传递的参数不同,而返回不同的结果形状。
比如下面的这个存储过称。
很明显当@Shape的值为1和2的时候,其返回的结果形状是完全不同的,一个返回的客户的3列数据,而一个返回的是订单的3列的数据。
这个代码就是来看如何为这种存储过程生成映射,并且如何使用这样的函数来获取数据。
首先定义一个存储过程,就使用前面的那个SQL语句。
接着,就是根据这个存储过程,创建映射函数了。不过在这之前,首先得要为不同的结果形状生成两个不同的实体类,也就是所谓的投影形状。定义如下:
现在才是映射函数的定义,代码如下:
可以使用类似如下的代码调用这种映射函数来访问数据:
需要注意的是:为GetResult指定元素类型时,务必要与所传递的@Shape参数值一致,否则就可能产生错误。
比如下面的这个存储过称。
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参数值一致,否则就可能产生错误。
相关文章推荐
- [代码]如何使用为顺序结果形状映射的存储过程(LINQ to SQL)
- [代码]如何使用存储过程返回行集(LINQ to SQL)
- [代码]如何使用带参数的存储过程(LINQ to SQL)
- LINQ TO SQL:如何接收多个结果集
- [代码]如何使用用户定义的标量值函数(LINQ to SQL)
- Linq to Oracle 使用教程(七)将数据库的存储过程映射到方法
- [代码]如何使用用户定义的表值函数(LINQ to SQL)
- 存储过程的输出参数为游标,PL/SQL中如何调用 Java代码如何调用
- 如何在 ASP.NET项目里面正确使用Linq to Sql(转)
- 10、步步为营VS 2008 + .NET 3.5(10) - DLINQ(LINQ to SQL)之调用存储过程的添加、查询、更新和删除
- linq to sql 存储过程
- sql 存储过程中 如何使用declare 有的存储过程声明了,有的没有声明。请回答的详细点
- 如何使用LINQ to SQL插入、修改、删除数据
- LINQ TO SQL:如何接收多个结果集
- LINQ体验(14)——LINQ to SQL语句之存储过程
- 一步一步学Linq to sql(五):存储过程
- 一步一步学Linq to sql(五):存储过程
- VSTS负载测试——如何:使用 SQL 创建结果存储区
- 如何使用 Visual Studio .NET 工具创建数据库对象和 Transact-SQL 存储过程。
- 在使用Hibernate时,因为一个查询需要更多的表连接而要使用SQL来解决性能问题。然而返回的结果集中包含了没有映射的Entity类中的表字段,在这个SQL中还有使用如何将层次关系的父子结点显示为横行