专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » linq语句:LINQ体验(13)——LINQ to SQL语句的运算符转换和ADO.NET和LINQ to SQL »正文

linq语句:LINQ体验(13)——LINQ to SQL语句的运算符转换和ADO.NET和LINQ to SQL

来源: 发布时间:星期五, 2009年1月9日 浏览:20次 评论:0
  运算符转换1.AsEnumerable:将类型转换为泛型 IEnumerable   使用 AsEnumerable<TSource> 可返回类型化为泛型 IEnumerable 参数在此举例中LINQ to SQL(使用默认泛型 Query)会尝试将查询转换为 SQL 并在服务器上执行但 where 子句引用用户定义客户端思路方法 (isValidProduct)此思路方法无法转换为 SQL

  解决思路方法是指定 where 客户端泛型 IEnumerable<T> 实现以替换泛型 IQueryable<T>可通过 AsEnumerable<TSource>运算符来执行此操作

var q =
  from p in db.Products.AsEnumerable
  where isValidProduct(p)
  select p;
  语句描述:这个例子就是使用AsEnumerable以便使用Where客户端IEnumerable实现而不是默认IQueryable将在服务器上转换为SQL并执行默认Query<T>实现这很有必要Where子句引用了用户定义客户端思路方法isValidProduct该思路方法不能转换为SQL

  2.ToArray:将序列转换为  使用 ToArray <TSource>可从序列创建

var q =
  from c in db.Customers
  where c.City "London"
  select c;
Customer qArray = q.ToArray;
  语句描述:这个例子使用 ToArray 将查询直接计算为

  3.ToList:将序列转换为泛型列表   使用 ToList<TSource>可从序列创建泛型列表下面举例使用 ToList<TSource>直接将查询计算结果放入泛型 List<T>

var q =
  from e in db.Employees
  where e.HireDate >= DateTime(1994, 1, 1)
  select e;
List<Employee> qList = q.ToList;
4.ToDictionary:将序列转化为字典  使用Enumerable.ToDictionary<TSource, TKey>思路方法可以将序列转化为字典TSource表示source中元素类型;TKey表示keySelector返回类型其返回个包含键和值Dictionary<TKey, TValue>

var q =
  from p in db.Products
  where p.UnitsInStock <= p.ReorderLevel && !p.Discontinued
  select p;
Dictionary<, Product> qDictionary =
  q.ToDictionary(p => p.ProductID);
foreach ( key in qDictionary.Keys)
{
  Console.WriteLine(key);
}
  语句描述:这个例子使用 ToDictionary 将查询和键表达式直接键表达式直接计算为 Dictionary<K, T>

  ADO.NET和LINQ to SQL 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 = SqlConnection(connString);
nwindConn.Open;
// ... 其它ADO.NET数据操作代码... //
//利用现有ADO.NET连接来创建个DataContext:
Northwind erop_db = Northwind(nwindConn);
var orders =
   from o in erop_db.Orders
   where o.Freight > 500.00M
   select o;
//返回Freight>500.00M订单
nwindConn.Close;
  语句描述:这个例子使用预先存在ADO.NET连接创建Northwind对象本例中查询返回运费至少为500.00 所有订单

  2.事务  当我们已经启动了自己数据库事务并且我们希望DataContext 包含在内时我们可以向 DataContext 提供此事务

  通过 .NET Framework 创建事务首选思路方法是使用 TransactionScope 对象通过使用此思路方法我们可以创建跨数据库及其他驻留在内存中资源管理器执行分布式事务事务范围几乎不需要资源就可以启动它们仅在事务范围内存在多个连接时才将自身提升为分布式事务

using (TransactionScope ts = 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 = SqlConnection(connString);
nwindConn.Open;
//利用现有ADO.NET连接来创建个DataContext:
Northwind erop_db = Northwind(nwindConn);
SqlTransaction nwindTxn = nwindConn.BeginTransaction;
try
{
  SqlCommand cmd = SqlCommand("UPDATE Products SET"
  +"QuantityPerUnit = 'single item' WHERE ProductID = 3");
  cmd.Connection = nwindConn;
  cmd.Transaction = nwindTxn;
  cmd.ExecuteNonQuery;
  erop_db.Transaction = nwindTxn;
  Product prod1 = erop_db.Products.First(p => p.ProductID 4);
  Product prod2 = erop_db.Products.First(p => p.ProductID 5);
  prod1.UnitsInStock -= 3;
  prod2.UnitsInStock -= 5;//这有不能为负数
  erop_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 对象做出更改



  3.直接执行 SQL语句1.直接执行SQL查询  如果 LINQ to SQL 查询不足以满足专门任务需要我们可以使用 ExecuteQuery 思路方法来执行 SQL 查询然后将查询结果直接转换成对象

var products = db.ExecuteQuery<Product>(
  "SELECT [Product List].ProductID,"+
  "[Product List].ProductName " +
  "FROM Products AS [Product List] " +
  "WHERE [Product List].Discontinued = 0 " +
  "ORDER BY [Product List].ProductName;"
);
  语句描述:这个例子使用ExecuteQuery<T>执行任意 SQL 查询并将所得行映射为 Product 对象序列

  2.直接执行SQL命令  采用DataContext 连接时可以使用ExecuteCommand来执行不返回对象 SQL 命令

db.ExecuteCommand
  ("UPDATE Products SET UnitPrice = UnitPrice + 1.00");
  语句描述:使用ExecuteCommand执行任意SQL命令本例中为将所有产品单价提高 1.00 批量更新



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: