登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

学无止境

一点积累,与大家分享

 
 
 

日志

 
 

如何:执行左外部联接  

2009-12-08 12:25:34|  分类: C#技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

左外部联接是这样一个联接:在其中返回第一个集合的每个元素,而无论该元素在第二个集合中是否具有相关元素。可以使用 LINQ,通过对分组联接的结果调用 DefaultIfEmpty 来执行左外部联接。

如何:执行左外部联接 - 秋的季节 - 秋的博客  示例

下面的示例演示如何对分组联接的结果调用 DefaultIfEmpty 方法来执行左外部联接。

若要生成两个集合的左外部联接,第一步是使用分组联接执行内部联接。(有关此过程的说明,请参见如何:执行内部联接(C# 编程指南)。)在此示例中,基于一个与 Pet.Owner 匹配的 Person 对象,将 Person 对象的列表内部联接到 Pet 对象的列表。

第二步是在结果集内包含第一个(左)集合的每个元素,即使该元素在右集合中没有匹配的元素也是如此。这是通过对分组联接中的每个匹配元素序列调用 DefaultIfEmpty 来实现的。在此示例中,对每个匹配的 Pet 对象序列调用 DefaultIfEmpty。如果对于任何 Person 对象,匹配的 Pet 对象序列都为空,则该方法将返回一个包含单个默认值的集合,从而确保每个 Person 对象都在结果集合中得到表示。

如何:执行左外部联接 - 秋的季节 - 秋的博客说明:

对于引用类型,默认值为 null;因此,该示例在访问每个 Pet 集合的每个元素之前都会检查是否存在 null 引用。

C#
class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}

class Pet
{
public string Name { get; set; }
public Person Owner { get; set; }
}

public static void LeftOuterJoinExample()
{
Person magnus = new Person { FirstName = "Magnus", LastName = "Hedlund" };
Person terry = new Person { FirstName = "Terry", LastName = "Adams" };
Person charlotte = new Person { FirstName = "Charlotte", LastName = "Weiss" };
Person arlene = new Person { FirstName = "Arlene", LastName = "Huff" };

Pet barley = new Pet { Name = "Barley", Owner = terry };
Pet boots = new Pet { Name = "Boots", Owner = terry };
Pet whiskers = new Pet { Name = "Whiskers", Owner = charlotte };
Pet bluemoon = new Pet { Name = "Blue Moon", Owner = terry };
Pet daisy = new Pet { Name = "Daisy", Owner = magnus };

// Create two lists.
List<Person> people = new List<Person> { magnus, terry, charlotte, arlene };
List<Pet> pets = new List<Pet> { barley, boots, whiskers, bluemoon, daisy };

var query = from person in people
join pet in pets on person equals pet.Owner into gj
from subpet in gj.DefaultIfEmpty()
select new { person.FirstName, PetName = (subpet == null ? String.Empty : subpet.Name) };

foreach (var v in query)
{
Console.WriteLine("{0,-15}{1}", v.FirstName + ":", v.PetName);
}
}

// This code produces the following output:
//
// Magnus: Daisy
// Terry: Barley
// Terry: Boots
// Terry: Blue Moon
// Charlotte: Whiskers
// Arlene:

  评论这张
 
阅读(431)| 评论(0)

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018