LINQ 项目-SQL 集成

.NET 语言集成查询可用于查询关系数据存储,而不必离开本地编程语言的语法或编译时环境。该工具(代号为 DLinq)利用 SQL 架构信息到 CLR 元数据的集成。该集成将 SQL 表和视图定义编译为可以从任何语言访问的 CLR 类型。

  DLinq 定义了两个核心属性([Table] 和 [Column]),它们指示哪些 CLR 类型和属性对应于外部 SQL 数据。[Table] 属性可以应用于类,并将 CLR 类型与命名的 SQL 表或视图相关联。[Column] 属性可以应用于任何字段或属性,并将成员与命名的 SQL 列相关联。这两个属性均被参数化,以允许保留特定于 SQL 的元数据。例如,请考虑以下这个简单的 SQL 架构定义:
  
  
create table People ( Name nvarchar ( 32 ) primary key not null , Age int not null , CanCode bit not null ) create table Orders ( OrderID nvarchar ( 32 ) primary key not null , Customer nvarchar ( 32 ) not null , Amount int )
  CLR 等效形式如下所示:
  
  
[Table(Name = " People " )] public class Person { [Column(DbType = " nvarchar(32) not null " , Id = true )] public string Name; [Column] public int Age; [Column] public bool CanCode; } [Table(Name = " Orders " )] public class Order { [Column(DbType = " nvarchar(32) not null " , Id = true )] public string OrderID; [Column(DbType = " nvarchar(32) not null " )] public string Customer; [Column] public int ? Amount; }
  在该示例中,请注意,可以为空的列映射到 CLR 中可以为空的类型(可以为空的类型首次出现在 .NET Framework 版本 2 中),并且对于无法 1:1 对应于 CLR 类型的 SQL 类型(例如,nvarchar、char、text),原始 SQL 类型会保留在 CLR 元数据中。

  要针对关系存储发出查询,LINQ 样式的 DLinq 实现会将查询从表达式树形式转换为 SQL 表达式以及适用于远程计算的 ADO.NET DbCommand 对象。例如,请考虑以下这个简单的查询:
  
  
// establish a query context over ADO.NET sql connection DataContext context = new DataContext( " Initial Catalog=petdb;Integrated Security=sspi " ); // grab variables that represent the remote tables that // correspond to the Person and Order CLR types Table custs = context.GetTable(); Table orders = context.GetTable(); // build the query var query = from c in custs, o in orders where o.Customer == c.Name select new { c.Name, o.OrderID, o.Amount, c.Age }; // execute the query foreach (var item in query) Console.WriteLine( " {0} {1} {2} {3} " , item.Name, item.OrderID, item.Amount, item.Age);
  DataContext 类型提供一个轻量转换器,它的工作是将标准查询操作符转换为 SQL。DataContext 使用现有的 ADO.NET IDbConnection 来访问存储,并且可以使用已建立的 ADO.NET 连接对象或者可用于创建连接对象的连接字符串来进行初始化。

  GetTable 方法提供与 IEnumerable 兼容的变量,这些变量可用于查询表达式,以表示远程表或视图。调用 GetTable 不会导致与数据库进行交互 – 虽然它们表示使用查询表达式与远程表或视图进行交互的潜在可能。在上述示例中,直到程序迭代完查询表达式,才会将查询传送到存储,在这种情况下,使用的是 C# 中的 foreach 语句。当程序首次迭代完查询后,DataContext 机制会将表达式树转换为以下将发送给存储的 SQL 语句:
  
  
SELECT [ t0 ] . [ Age ] , [ t1 ] . [ Amount ] , [ t0 ] . [ Name ] , [ t1 ] . [ OrderID ] FROM [ Customers ] AS [ t0 ] , [ Orders ] AS [ t1 ] WHERE [ t1 ] . [ Customer ] = [ t0 ] . [ Name ]
  需要注意的是,通过将查询功能直接构建到本地编程语言中,开发人员可以完全控制关系模型,而不必将关系静态转换为 CLR 类型。完整的对象/关系映射还可以利用这个核心查询功能,以方便需要该功能的用户。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值