0

1.用from子句进行复核查询
using System;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] intAry1 = { 2,3,4,5,6,77};
            int[] intAry2 = { 2,4,4,345,45,34,23,324,243,423,213343};
            var query1 = from var1 in intAry1
                         from var2 in intAry2
                         where var1 % var2 == 0
                         group var2 by var2;
            foreach (var grp in query1)
            {
                Console.WriteLine("{0}", grp.Key);
                foreach (var item in grp)
                {
                    Console.WriteLine("{0}",item);
                }
                Console.WriteLine();
            }
        }
    }
}

2.用join子句进行内部联接

内部联接中join子句的格式如下所示:

join element in dataSource on exp1 equals exp2

其中,dataSource表示数据源,它是联接要使用的第二个数据集。element表示存储dataSource中元素的本地变量。exp1和exp2表示两个表达式,它们具有相同的数据类型,可以用equals进行比较。如果exp1和exp2相等,则当前的元素将添加到查询结果。

using System;
using System.Linq;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] intAry1 = { 5, 15, 25, 30,40,50,60,70, };
            int[] intAry2 = { 10, 20, 30, 40, 50, 60 };
            var query1 = from val1 in intAry1
                         join val2 in intAry2 on val1 equals val2
                         select new { Val1 = val1, Val2 = val2 };
            foreach (var item in query1)
            {
                Console.WriteLine(item);
            }
        }
    }
}

3.用join子句进行分组联接

有时候需要将查询结果按照第一个数据集中的元素进行分组,这就需要使用join子句的另外一种用法--分组联接。

join element in dataSource on exp1 equals exp2 into grpName

其中,into关键字表示将这些数据分组并保存到grpName中,grpName是保存一组数据的集合。

using System;
using System.Linq;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] intAry1 = { 5, 15, 25, 30,40,50,60,70, };
            int[] intAry2 = { 10, 20, 30, 40, 50, 60 };
            var query1 = from val1 in intAry1
                         join val2 in intAry2 on val1 equals val2 into valGrp
                         select new { Val1 = val1, Val2 = valGrp };
            foreach (var obj in query1)
            {
                Console.WriteLine("{0}",obj.Val1);
                foreach (var item in obj.Val2)
                {
                    Console.WriteLine("{0}", item);
                }
                Console.WriteLine();
            }
        }
    }
}

4.用join子句进行左外部联接

第三种联接是左外部联接,它返回第一个集合中的所有元素,无论它是否在第二个集合中有相关元素。

在LINQ中,通过对分组联接的结果调用DefaultIfEmpty()来执行左外部联接。DefaultIfEmpty()方法从列表中获取指定元素。如果列表为空,则返回默认值。

using System;
using System.Linq;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] intAry1 = { 5, 15, 25, 30,40,50,60,70, };
            int[] intAry2 = { 10, 20, 30, 40, 50, 60,40,6,2345,23 };
            var query1 = from val1 in intAry1
                         join val2 in intAry2 on val1 equals val2 into valGrp
                         from grp in valGrp.DefaultIfEmpty()
                         select new {Val1 = val1,Val2 = grp};
            foreach (var item in query1)
            {
                Console.WriteLine("{0}",item);
            }
        }
    }
}

注意:

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

http://www.cnblogs.com/wlb/archive/2009/08/25/1553980.html

关闭 返回顶部
联系我们
Copyright © 2011. 聚财吧. All rights reserved.