LINQ 项目-SQL 集成

介绍DLinq(.NET语言集成查询)如何简化从关系数据库到.NET对象的映射过程,包括如何使用属性定义表和列的映射关系,以及如何执行基本的查询操作。
.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 类型。完整的对象/关系映射还可以利用这个核心查询功能,以方便需要该功能的用户。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值