云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > LINQ to SQL语法及实例大全

LINQ to SQL语法及实例大全

  • 62 次阅读
  • 3 次下载
  • 2025/5/7 5:55:39

where c.City == \ select c;

Customer[] qArray = q.ToArray();

语句描述:这个例子使用ToArray将查询直接计算为数组。

3.ToList:将序列转换为泛型列表

使用ToList可从序列创建泛型列表。下面的示例使用ToList直接将查询的计算结果放入泛型List。 var q =

from e in db.Employees

where e.HireDate >= new DateTime(1994, 1, 1) select e;

List qList = q.ToList();

4.ToDictionary:将序列转化为字典

使用Enumerable.ToDictionary方法可以将序列转化为字典。TSource表示source中的元素的类型;TKey表示keySelector返回的键的类型。其返回一个包含键和值的Dictionary。 var q =

from p in db.Products

where p.UnitsInStock <= p.ReorderLevel && ! p.Discontinued select p;

Dictionary qDictionary = q.ToDictionary(p => p.ProductID); foreach (int key in qDictionary.Keys) {

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 Customers_By_City( [Parameter(DbType=\{

- 39 -

IExecuteResult result = this.ExecuteMethodCall(this, (

(MethodInfo) (MethodInfo.GetCurrentMethod())), param1); return ((ISingleResult) (result.ReturnValue)); }

我们用下面的代码调用:

ISingleResult result = db.Customers_By_City(\

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 Whole_Or_Partial_Customers_Set([Parameter(DbType=\System.Nullable param1) {

IExecuteResult result = this.ExecuteMethodCall(this,

((MethodInfo)(MethodInfo.GetCurrentMethod())), param1); return ((ISingleResult) (result.ReturnValue)); }

但是,VS2008会把多结果集存储过程识别为单结果集的存储过程,默认生成的代码我们要手动修改一下,要求返回多个结果集,像这样:

[Function(Name=\[ResultType(typeof (WholeCustomersSetResult))] [ResultType(typeof (PartialCustomersSetResult))]

public IMultipleResults Whole_Or_Partial_Customers_Set([Parameter (DbType=\{

- 40 -

搜索更多关于: LINQ to SQL语法及实例大全 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

where c.City == \ select c; Customer[] qArray = q.ToArray(); 语句描述:这个例子使用ToArray将查询直接计算为数组。 3.ToList:将序列转换为泛型列表 使用ToList可从序列创建泛型列表。下面的示例使用ToList直接将查询的计算结果放入泛型List。 var q = from e in db.Employees where e.HireDate >= new DateTime(1994, 1, 1) select e; List qList = q.ToList(); 4.ToDictionary:将序列转化为字典

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com