LINQ:使用join进行联接

在LINQ中,join可以实现3种类型的联接,分别是内部联接、分组联接、左外部联接。

  1. 内部联接:
    private static void UseInnnerJoin()
            {
                int[] intArray1 = { 5, 15, 25, 30, 33, 40 };
                int[] intArray2 = { 10, 20, 30, 50, 60, 70, 80 };
                var query1 = from val1 in intArray1
                    join val2 in intArray2 on val1 % 5 equals val2 % 15
                    select new { VAL1 = val1, VAL2 = val2 };
                foreach (var item in query1)
                {
                    Console.WriteLine(item);
                }
            }

    运行结果:

    { VAL1 = 5, VAL2 = 30 }
    { VAL1 = 5, VAL2 = 60 }
    { VAL1 = 15, VAL2 = 30 }
    { VAL1 = 15, VAL2 = 60 }
    { VAL1 = 25, VAL2 = 30 }
    { VAL1 = 25, VAL2 = 60 }
    { VAL1 = 30, VAL2 = 30 }
    { VAL1 = 30, VAL2 = 60 }
    { VAL1 = 40, VAL2 = 30 }
    { VAL1 = 40, VAL2 = 60 }
    

     

  2. 分组联接:可用于产生分层的数据结果,它将第一个集合中的每个元素与第二个集合中的一组相关元素进行分配。即使第一个集合中的元素在第二个集合中没有配对元素,也会为它产生一个空的分组对象。
    private static void UseGroupJoin()
            {
                int[] intArray1 = {5, 15, 25, 30, 33, 40};
                int[] intArray2 = {10, 20, 30, 50, 60, 70, 80};
                var query1 = from val1 in intArray1
                    join val2 in intArray2 on val1 % 5 equals val2 % 15 into val2Group
                    select new {VAL1 = val1, VAL2Group = val2Group };
                foreach (var item in query1)
                {
                    Console.WriteLine(item.VAL1);
                    foreach (var subItem in item.VAL2Group)
                    {
                        Console.WriteLine(subItem);
                    }
                    Console.WriteLine();
                }
            }

     

  3. 左外部联接:返回第一个集合中的所有元素,无论它是否在第二个集合中有相关元素。在LINQ中,通过对分组链接的结果调用DefaultIfEmpty()方法来执行左外部联接。DefaultIfEmpty()从列表中获取指定元素,如果列表为空,则返回默认值。
    private static void UseLeftJoin()
            {
                int[] intArray1 = { 5, 15, 25, 30, 33, 40 };
                int[] intArray2 = { 10, 20, 30, 50, 60, 70, 80 };
                var query1 = from val1 in intArray1
                    join val2 in intArray2 on val1 % 5 equals val2 % 15 into val2Group
                    from grp in val2Group.DefaultIfEmpty()
                    select new { VAL1 = val1, VAL2Group = grp };
                foreach (var item in query1)
                {
                    Console.WriteLine(item);
                }
            }

    运行结果:

    { VAL1 = 5, VAL2Group = 30 }
    { VAL1 = 5, VAL2Group = 60 }
    { VAL1 = 15, VAL2Group = 30 }
    { VAL1 = 15, VAL2Group = 60 }
    { VAL1 = 25, VAL2Group = 30 }
    { VAL1 = 25, VAL2Group = 60 }
    { VAL1 = 30, VAL2Group = 30 }
    { VAL1 = 30, VAL2Group = 60 }
    { VAL1 = 33, VAL2Group = 0 }
    { VAL1 = 40, VAL2Group = 30 }
    { VAL1 = 40, VAL2Group = 60 }
    

    左外部联接和分组联接虽然相似但并非一样。分组联接返回的查询结果是一种分层数据结构,需要使用两层foreach才能遍历它的结果。而左外部联接是在分组联接的查询结果上再进行一次查询,所以它在join之后还有一个from子句进行查询。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值