Linq Coding -- Part Six (Join之分组联接)

Join 子句有三种最常见的联接类型:内部联接,分组联接,左外部联接
本次介绍:分组联接

       分组联接:见名知意,它本质上是一个对象数组序列。说白了就是结果序列会组织为多个组形式数据进行返回。
即可术语描述的话,就是会产生一个分层的结果序列,此序列拿第一个集合中的每个元素与第二个集合中的一组相关元素进行配对,如果找不到就返回空数组。那基本上分组联接和内部联接基本差不多。 另外就是在分组联接中没有等效的关系。
* 分组联接非常适合于使用 LINQ to XML 来创建 XML。

 public class JoinUsingLinqPartSecInto : Interface
    
{
        
Interface Members#region Interface Members

        
public void invoke()
        
{
            
Data#region Data

            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 };

            List
<Person> people = new List<Person>
            
{
                magnus,terry,charlotte, arlene
            }
;

            List
<Pet> pets = new List<Pet>
            
{
                barley,boots,whiskers,bluemoon,daisy
            }
;

            
#endregion


            
/**////创建匿名类型
            var query = from person in people
                        join pet 
in pets
                            on person
                            equals pet.Owner
                            into nonameList
                        select 
new { OwnerName = person.FirstName, Pets = nonameList };

            
foreach (var v in query)
            
{
                Console.WriteLine(
"{0}:", v.OwnerName);
                
foreach (Pet pet in v.Pets)
                    Console.WriteLine(
"  {0}", pet.Name);
            }


            
/**////创建表示已联接对象的 XML 元素
            System.Xml.Linq.XElement xmlInto = new System.Xml.Linq.XElement
            (
"XmlFileBase",
                from person 
in people
                join pet 
in pets
                    on person
                    equals pet.Owner
                    into pp
                select 
new XElement("Person",
                    
new XAttribute("FirstName", person.FirstName),
                    
new XAttribute("LastName", person.LastName),
                    from subpet 
in pp
                    select 
new XElement("Pet", subpet.Name)
                )
            );

            Console.WriteLine(xmlInto);
        }


        
#endregion

    }

*以下这三种查询基本上都是等效查询(这也是使用分组联接实现内部联接的一例)
querythree
使用不带 into 子句的 join 子句执行内部联接所获得的结果集。

 1  var queryone  =  from person  in  people
 2                         join pet  in  pets
 3                             on person
 4                             equals pet.Owner
 5                             into nonameList
 6                         select  new   { OwnerName = person.FirstName, Pets = nonameList } ;
 7
 8             var querytwo  =  from person  in  people
 9                         join pet  in  pets
10                             on person
11                                 equals pet.Owner
12                                     into nonnamelist
13                         from subpet  in  nonnamelist
14                         select  new   { OwnerName = person.FirstName, PetName = subpet.Name } ;
15
16             var querythree  =  from person  in  people
17                          join pet  in  pets on person equals pet.Owner
18                          select  new   { OwnerName = person.FirstName, PetName = pet.Name } ;

LINQ Coding 目录

  1. Linq Coding -- Part One
  2. Linq Coding -- Part Two[标准查询运算符]
  3. Linq Coding -- Part Three [Let子句]
  4. Linq Coding -- Part Four[Concat应用]
  5. Linq Coding -- Part Five (Join之内部联接查询)
  6. Linq Coding -- Part Six (Join之分组联接)
  7. Linq Coding -- Part Seven (Join之左外部联接、DefaultIfEmpty、GroupJoin)
  8. Linq Coding -- Part Eight (Equals Topic)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值