C# 3.0入门系列(十)-之Join操作

本节讲join操作。我们知道,T-sql中,有三种最基本的join,inner join, left join, 和right join。 而dlinq并不支持right join。道理很简单,right join以right表为基础,left表中没有对应记录的,将以null值填充。而dlinq以left表做为主表创建对象。如果一个对象为null,你如何获取它的其他的属性呢?

在C# 3.0入门系列(四)-之Select操作一文中,我们提到了query expression首先会被翻译成标准的API, 而dlinq在join操作中,一共为我们提供了三个API.它们是Join, SelectMany和GroupJoin

Join

在101 的sample中,并没有join的例子。当一个query expression 有join字句时,而没有into字句,它将会被翻译成join方法。如,以Customers为主表,Orders为子表,用CustomerID 做关联进行join操作。

var q =
from c in db.Customers
join o in db.Orders on c.CustomerID equals o.CustomerID

select new { c.CustomerID, o.EmployeeID };

它将会被翻译成

var q = db.Customers.Join(db.Orders, c => c.CustomerID, o => o.CustomerID, (c, o) => new { c.CustomerID, o.EmployeeID });

join方法的第一个参数,为子表,第二个参数,表示主表中的选择键,第三个参数为子表中的对应键,第四个为最终筛选结果。大家需要注意的时,因为参数的顺序是确定的,所以在写dlinq语句时,c.CustomerID equals o.CustomerID 的顺序是不能变的。

该语句所产生的T-sql语句为

SELECT [t0].[CustomerID], [t1].[EmployeeID]
FROM [Customers] AS [t0]
INNER JOIN [Orders] AS [t1] ON [t0].[CustomerID] = [t1].[CustomerID]

SelectMany

在101sample中,给了4个SelectMany的例子。会被翻译成SelectMany需要满足2个条件。1,query语句中没有join和into,2,必须出现EntitySet。 关于EntitySet,请参考C#3.0进阶系列(一)-从映射讲起

先看第一个例子

var q =
from c in db.Customers
from o in c.Orders
where c.City == "London"
select o;

Customers与Orders是1:M的关系。即Orders在Customers类中,以EntitySet出现。所以第二个from是从c.Orders而不是db.Orders里进行筛选。定义了他们关系的Mapping Code用Attribute保存了他们的关系。如

[Association(Name="Order_OrderDetail", Storage="_OrderDetails", OtherKey="OrderID")]
[Association(Name="Order_OrderDetail", Storage="_Order", ThisKey="OrderID", IsForeignKey=true)]

所以,你就不用担心,dlinq是否知道该按那个键进行关联。有兴趣的朋友,可以自己修改这里的OtherKey和ThisKey的值,看看翻译的T-sql语句是否变了。

第二个例子

var q =
from p in db.Products
where p.Supplier.Country == "USA" && p.UnitsInStock == 0
select p;

这个例子,直接就使用了p.Supplier.Country 做条件,这样,也间接关联了Supplier表。该语句生成的T-sql语句更是值得揣摩,这大概是Left Out Join 的最简单的Dlinq语句。

SELECT [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID], [t0].[CategoryID], [t0].[QuantityPerUnit], [t0].[UnitPrice], [t0].[UnitsInStock], [t0].[UnitsOnOrder], [t0].[ReorderLevel], [t0].[Discontinued]
FROM [dbo].[Products] AS [t0]
LEFT OUTER JOIN [dbo].[Suppliers] AS [t1] ON [t1].[SupplierID] = [t0].[SupplierID]
WHERE ([t1].[Country] = @p0) AND ([t0].[UnitsInStock] = @p1)
-- @p0: Input String (Size = 3; Prec = 0; Scale = 0) [USA]
-- @p1: Input Int32 (Size = 0; Prec = 0; Scale = 0) [0]
-- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 2.0.20612.0

时间: 2024-11-02 22:00:13

C# 3.0入门系列(十)-之Join操作的相关文章

C# 3.0入门系列-目录导航

1 C# 3.0 入门系列(一) 从linq开始引C# 3.0. 2 C# 3.0入门系列(二) 数据库的准备,引入Linq To Sql的准备. 3 C# 3.0入门系列(三) 第一个Linq To Sql工程. 4 C# 3.0入门系列(四)-之Select操作 Select语法. 5 C# 3.0入门系列(五)-之Where操作 Where操作语法. 6 C# 3.0入门系列(六)-之OrderBy操作 OrderBy 操作语法. 7 C# 3.0入门系列(七)--之OR工具介绍 C# 3

C# 3.0入门系列(五)-之Where操作

从本节开始,本文正式更名为C#3.0入门系列.先发布一则消息,VS2007 Beta版本已经发布咯,下载地址: http://www.microsoft.com/downloads/details.aspx?FamilyID=1FF0B35D-0C4A-40B4-915A-5331E11C39E6&displaylang=en 大家快去下载呀,我也好和大家一起体验该版本最新功能呀. dlinq也更名为linq to sql.本文也跟着做相应变化,稍候,我会去更新前面的文章.我们先接着讲linq的

C# 3.0入门系列(十二)-Lambda表达式中Lifting

Lambda表达式是由匿名方法演化而来的更加高级的形式.关于匿名方法,请参阅http://msdn.microsoft.com/msdnmag/issues/04/05/C20/.关于Lambda表达式的演化,请参阅http://msdn.microsoft.com/msdnmag/issues/07/06/csharp30/default.aspx?loc=zh.英文原版为http://msdn.microsoft.com/msdnmag/issues/07/06/CSharp30/. 1,L

C# 3.0入门系列(七)--之OR工具介绍(上)

--不得不再次给关注dlinq的朋友道歉了.好久都没有更新blog了.因为工作的变动,还要赶期限,没有时间关注这里了. 先发布一则消息.Orcas Beta1, 这个才是beta1,可以到http://www.microsoft.com/downloads/details.aspx?FamilyID=f10fb5df-e369-4db4-b9a7-845dbf793368&DisplayLang=en 下载.5月1号的版本.最早4月19号就出来过一个,只是没有在意.还有一个http://www.

C# 3.0入门系列(十一)-之In, Like操作

有这么一个例子,寻找一个表中的某个字段介于某个给定的集合该怎么办?Sql写起来很简单,比如:Select * from table where id in (2,3, 4, 5). 就是寻找id字段为这个给定的集合(2,3, 4, 5)内的值.那Linq to Sql该怎么做呢?一个字,简单. In Operator 比如,我们想要查找,"AROUT", "BOLID" 和 "FISSA" 这三个客户的订单.该如何做呢?Linq to Sql是这

C# 3.0入门系列(九)-之GroupBy操作

有朋友反馈说我提供的sample不能编译.大概是版本的问题,可以到http://msdn2.microsoft.com/en-us/bb330936.aspx下载for beta1的版本.本节接着讲groupby. 上一节,我们讲了如何理解groupby返回的结果.本节会延这个思路阐述下去.先来看下面的例子 GroupBy操作中Select的匿名类 var q = from p in db.Products group p by p.CategoryID into g select new {

C# 3.0入门系列(四)-之Select操作

先给关注dlinq的朋友们道歉,最近工作实在忙,没有时间来写blog.从本节开始,我们讲dlinq语法咯.我们先从select子句讲起.看下面的例子. var q = from c in db.Customers select c.ContactName; 这是一个最简单的dlinq查询语句,查询得到联系人的名字.在这里,我需要提醒下大家的是,像这个语句只是个声明,dlinq并没有真正把数据取出来,只有当你需要该数据的时候,它才会帮你去取,这就是延迟加载(deferred loading).如果

C# 3.0入门系列(二)

在第一篇中,我已经和大家简单介绍了linq.也和大家提起linq是C# 3.0里的一个特性.不过,你去装linq priview时,你会发现,它提供了许多vb的linq代码.从现在的情况看,linq会被移植到.net framework下.在本篇中,笔者将开始更加详细的介绍dlinq.同时,也会介绍很实用的技巧和方法.在这之前,你需要安装s2008 beta2版本.可以到 http://msdn2.microsoft.com/en-us/vstudio/aa700831.aspx 下载.如果,你

C# 3.0入门系列(一)

谈到dlinq,就不得不先说linq.让我们先看看什么是linq.linq是Language Integrated Query的缩写.那么事实上dlinq就是Database Language Integrated Query的缩写.linq和dlinq最大的区别就在与linq是对内存进行操作,而dlinq的操作对象为数据库. 我们先来看一个linq的例子.在这之前,你需要安装s2008 beta2版本.可以到 http://msdn2.microsoft.com/en-us/vstudio/a