本节讲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操作。

C#3.0入门系列(十)-之Join操作            var q =
C#3.0入门系列(十)-之Join操作    
from c in db.Customers
C#3.0入门系列(十)-之Join操作    
join o in db.Orders on c.CustomerID equals o.CustomerID
C#3.0入门系列(十)-之Join操作
C#3.0入门系列(十)-之Join操作    
select new { c.CustomerID, o.EmployeeID };
它将会被翻译成
C#3.0入门系列(十)-之Join操作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语句为
C#3.0入门系列(十)-之Join操作SELECT [t0].[CustomerID][t1].[EmployeeID]
C#3.0入门系列(十)-之Join操作
FROM [Customers] AS [t0]
C#3.0入门系列(十)-之Join操作
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入门系列(十)-之Join操作    var q =
C#3.0入门系列(十)-之Join操作        
from c in db.Customers
C#3.0入门系列(十)-之Join操作        
from o in c.Orders
C#3.0入门系列(十)-之Join操作        
where c.City == "London"
C#3.0入门系列(十)-之Join操作        
select o;

相关文章:

  • 2022-01-13
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-09-23
  • 2021-06-12
  • 2022-01-12
  • 2021-10-26
  • 2021-05-15
相关资源
相似解决方案