当前位置:首页 > LINQ to SQL语法及实例大全
where c.City == \ select c;
Customer[] qArray = q.ToArray();
语句描述:这个例子使用ToArray将查询直接计算为数组。
3.ToList:将序列转换为泛型列表
使用ToList
from e in db.Employees
where e.HireDate >= new DateTime(1994, 1, 1) select e;
List
4.ToDictionary:将序列转化为字典
使用Enumerable.ToDictionary
from p in db.Products
where p.UnitsInStock <= p.ReorderLevel && ! p.Discontinued select p;
Dictionary
Console.WriteLine(key); }
语句描述:这个例子使用ToDictionary将查询和键表达式直接键表达式直接计算为Dictionary
LINQ to SQL语句(19)之ADO.NET与LINQ to SQL
ADO.NET与LINQ to SQL
它基于由ADO.NET提供程序模型提供的服务。因此,我们可以将LINQ to SQL代码与现有的ADO.NET应用程序混合在一起,将当前ADO.NET解决方案迁移到LINQ to SQL。
1.连接
在创建LINQ to SQL DataContext时,可以提供现有ADO.NET连接。对DataContext的所有操作(包括查询)都使用所提供的这个连接。如果此连接已经打开,则在您使用完此连接时,LINQ to SQL会保持它的打开状态不变。我们始终可以访问此连接,另外还可以使用Connection属性自行关闭它。 //新建一个标准的ADO.NET连接:
SqlConnection nwindConn = new SqlConnection (connString); nwindConn.Open();
// ... 其它的ADO.NET数据操作 代码... //
//利用现有的ADO.NET连接来创建一个DataContext: Northwind interop_db = new Northwind(nwindConn); var orders =
from o in interop_db.Orders where o.Freight > 500.00M select o;
//返回Freight>500.00M的订单 nwindConn.Close();
语句描述:这个例子使用预先存在的ADO.NET连接创建Northwind对象,本例中的查询返回运费至少为500.00的所有订单。
- 37 -
2.事务
当我们已经启动了自己的数据库事务并且我们希望DataContext包含在内时,我们可以向DataContext提供此事务。
通过.NET Framework创建事务的首选方法是使用TransactionScope对象。通过使用此方法,我们可以创建跨数据库及其他驻留在内存中的资源管理器执行的分布式事务。事务范围几乎不需要资源就可以启动。它们仅在事务范围内存在多个连接时才将自身提升为分布式事务。 using (TransactionScope ts = new TransactionScope()) {
db.SubmitChanges(); ts.Complete(); }
注意:不能将此方法用于所有数据库。例如,SqlClient连接在针对SQL Server 2000服务器使用时无法提升系统事务。它采取的方法是,只要它发现有使用事务范围的情况,它就会自动向完整的分布式事务登记。
下面用一个例子说明一下事务的使用方法。在这里,也说明了重用ADO.NET命令和DataContext之间的同一连接。 var q =
from p in db.Products where p.ProductID == 3 select p;
//使用LINQ to SQL查询出来
//新建一个标准的ADO.NET连接:
SqlConnection nwindConn = new SqlConnection(connString); nwindConn.Open();
//利用现有的 ADO.NET连接来创建一个DataContext: Northwind interop_db = new Northwind(nwindConn); SqlTransaction nwindTxn = nwindConn.BeginTransaction(); try {
SqlCommand cmd = new SqlCommand(\ +\ cmd.Connection = nwindConn; cmd.Transaction = nwindTxn; cmd.ExecuteNonQuery();
interop_db.Transaction = nwindTxn;
Product prod1 = interop_db.Products.First(p => p.ProductID == 4); Product prod2 = interop_db.Products.First(p => p.ProductID == 5); prod1.UnitsInStock -= 3;
prod2.UnitsInStock -= 5;//这有一个错 误,不能为负数 interop_db.SubmitChanges(); nwindTxn.Commit(); }
catch (Exception e) {
// 如果有一个错误,所有的操作回滚 Console.WriteLine (e.Message); }
nwindConn.Close();
语句描述:这个例子使用预先存在的ADO.NET连接创建Northwind对象,然后与此对象共享一个ADO.NET事务。此事务既用于通过ADO.NET连接执行SQL命令,又用于通过Northwind对象提交更改。当事务因违反CHECK约束而中止时,将回滚所有更改,包括通过SqlCommand做出的更改,以及通过Northwind对象做出的更改。
- 38 -
LINQ to SQL语句(20)之存储过程
存储过程
在我们编写程序中,往往需要一些存储过程,在LINQ to SQL中怎么使用呢?也许比原来的更简单些。下面我们以NORTHWND.MDF数据库中自带的几个存储过程来理解一下。
1.标量返回
在数据库中,有名为Customers Count By Region的存储过程。该存储过程返回顾客所在\区域的数量。
ALTER PROCEDURE [dbo]. [NonRowset] (@param1 NVARCHAR(15)) AS BEGIN
SET NOCOUNT ON; DECLARE @count int
SELECT @count = COUNT(*)FROM Customers WHERECustomers.Region = @Param1 RETURN @count END
我们只要把这个存储过程拖到O/R设计器内,它自动生成了以下代码段: [Function(Name = \public int Customers_Count_By_Region([Parameter (DbType = \{
IExecuteResult result = this.ExecuteMethodCall(this,
((MethodInfo) (MethodInfo.GetCurrentMethod())), param1); return ((int) (result.ReturnValue)); }
我们需要时,直接调用就可以了,例如: int count = db.CustomersCountByRegion (\Console.WriteLine(count);
语句描述:这个实例使用存储过程返回在“WA”地区的客户数。
2.单一结果集
从数据库中返回行集合,并包含用于筛选结果的输入参数。当我们执行返回行集合的存储过程时,会用到结果类,它存储从存储过程中返回的结果。
下面的示例表示一个存储过程,该存储过程返回客户行并使用输入参数来仅返回将“London”列为客户城市的那些行的固定几列。
ALTER PROCEDURE [dbo].[Customers By City]
-- Add the parameters for the stored procedure here (@param1 NVARCHAR(20)) AS BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON;
SELECT CustomerID, ContactName, CompanyName, City from Customers as c where c.City=@param1 END
拖到O/R设计器内,它自动生成了以下代码段: [Function(Name=\
public ISingleResult
- 39 -
IExecuteResult result = this.ExecuteMethodCall(this, (
(MethodInfo) (MethodInfo.GetCurrentMethod())), param1); return ((ISingleResult
我们用下面的代码调用:
ISingleResult
foreach (Customers_By_CityResult cust in result) {
Console.WriteLine(\ cust.City); }
语句描述:这个实例使用存储过程返回在伦敦的客户的CustomerID和City。
3.多个可能形状的单一结果集
当存储过程可以返回多个结果形状时,返回类型无法强类型化为单个投影形状。尽管LINQ to SQL可以生成所有可能的投影类型,但它无法获知将以何种顺序返回它们。ResultTypeAttribute属性适用于返回多个结果类型的存储过程,用以指定该过程可以返回的类型的集合。 在下面的SQL代码示例中,结果形状取决于输入(param1=1或param1=2)。我们不知道先返回哪个投影。
ALTER PROCEDURE [dbo]. [SingleRowset_MultiShape] -- Add the parameters for the stored procedure here (@param1 int ) AS BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; if(@param1 = 1)
SELECT * from Customers as c where c.Region = 'WA' else if (@param1 = 2)
SELECT CustomerID, ContactName, CompanyName from Customers as c where c.Region = 'WA' END
拖到O/R设计器内,它自动生成了以下代码段:
[Function (Name=\public ISingleResult
IExecuteResult result = this.ExecuteMethodCall(this,
((MethodInfo)(MethodInfo.GetCurrentMethod())), param1); return ((ISingleResult
但是,VS2008会把多结果集存储过程识别为单结果集的存储过程,默认生成的代码我们要手动修改一下,要求返回多个结果集,像这样:
[Function(Name=\[ResultType(typeof (WholeCustomersSetResult))] [ResultType(typeof (PartialCustomersSetResult))]
public IMultipleResults Whole_Or_Partial_Customers_Set([Parameter (DbType=\{
- 40 -
共分享92篇相关文档