LINQ from子句进行复合查询实现方法

开发 后端
这里将为大家讲解LINQ from子句进行复合查询与join子句进行连接,from字句是LINQ中使用频度较高的组件。希望本文对大家有所帮助。

LINQ from子句是比较常见的语句,通常是作为查询中的重要部分。本文将要介绍的是LINQ from字句进行复核查询。

1.用LINQ from子句进行复核查询

  1. using System;  
  2. using System.Linq;  
  3.  
  4. namespace ConsoleApplication1  
  5. {  
  6.     class Program  
  7.     {  
  8.         static void Main(string[] args)  
  9.         {  
  10.             int[] intAry1 = { 2,3,4,5,6,77};  
  11.             int[] intAry2 = { 2,4,4,345,45,34,23,324,243,423,213343};  
  12.             var query1 = from var1 in intAry1  
  13.                          from var2 in intAry2  
  14.                          where var1 % var2 == 0  
  15.                          group var2 by var2;  
  16.             foreach (var grp in query1)  
  17.             {  
  18.                 Console.WriteLine("{0}", grp.Key);  
  19.                 foreach (var item in grp)  
  20.                 {  
  21.                     Console.WriteLine("{0}",item);  
  22.                 }  
  23.                 Console.WriteLine();  
  24.             }  
  25.         }  
  26.     }  

from子句查询结果

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

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

join element in dataSource on exp1 equals exp2

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

  1. using System;  
  2. using System.Linq;  
  3.  
  4. namespace ConsoleApplication2  
  5. {  
  6.     class Program  
  7.     {  
  8.         static void Main(string[] args)  
  9.         {  
  10.             int[] intAry1 = { 5, 15, 25, 30,40,50,60,70, };  
  11.             int[] intAry2 = { 10, 20, 30, 40, 50, 60 };  
  12.             var query1 = from val1 in intAry1  
  13.                          join val2 in intAry2 on val1 equals val2  
  14.                          select new { Val1 = val1, Val2 = val2 };  
  15.             foreach (var item in query1)  
  16.             {  
  17.                 Console.WriteLine(item);  
  18.             }  
  19.         }  
  20.     }  

join子句查询结果

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

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

join element in dataSource on exp1 equals exp2 into grpName

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

  1. using System;  
  2. using System.Linq;  
  3.  
  4. namespace ConsoleApplication2  
  5. {  
  6.     class Program  
  7.     {  
  8.         static void Main(string[] args)  
  9.         {  
  10.             int[] intAry1 = { 5, 15, 25, 30,40,50,60,70, };  
  11.             int[] intAry2 = { 10, 20, 30, 40, 50, 60 };  
  12.             var query1 = from val1 in intAry1  
  13.                          join val2 in intAry2 on val1 equals val2 into valGrp  
  14.                          select new { Val1 = val1, Val2 = valGrp };  
  15.             foreach (var obj in query1)  
  16.             {  
  17.                 Console.WriteLine("{0}",obj.Val1);  
  18.                 foreach (var item in obj.Val2)  
  19.                 {  
  20.                     Console.WriteLine("{0}", item);  
  21.                 }  
  22.                 Console.WriteLine();  
  23.             }  
  24.         }  
  25.     }  

分组联接结果

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

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

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

  1. using System;  
  2. using System.Linq;  
  3.  
  4. namespace ConsoleApplication2  
  5. {  
  6.     class Program  
  7.     {  
  8.         static void Main(string[] args)  
  9.         {  
  10.             int[] intAry1 = { 5, 15, 25, 30,40,50,60,70, };  
  11.             int[] intAry2 = { 10, 20, 30, 40, 50, 60,40,6,2345,23 };  
  12.             var query1 = from val1 in intAry1  
  13.                          join val2 in intAry2 on val1 equals val2 into valGrp  
  14.                          from grp in valGrp.DefaultIfEmpty()  
  15.                          select new {Val1 = val1,Val2 = grp};  
  16.             foreach (var item in query1)  
  17.             {  
  18.                 Console.WriteLine("{0}",item);  
  19.             }  
  20.         }  
  21.     }  

左外部联接结果

LINQ from子句注意

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

本文来自Kevin博客园博文《用from子句进行复合查询与join子句进行连接

【编辑推荐】

  1. LINQ和ADO.NET技术概述
  2. LINQ查询的目的与实现手段
  3. LINQ基础概念总结
  4. LINQ查询表达式功能详解
  5. ADO.NET中的多数据表操作读取
责任编辑:彭凡 来源: 博客园
相关推荐

2009-06-12 09:44:04

LINQ查询复合from子句

2009-09-16 13:02:12

LINQ查询子句

2009-09-07 17:18:33

LINQ查询表达式

2009-09-10 17:30:15

LINQ Where子

2009-09-15 16:09:12

LINQ进行查询

2009-09-07 17:05:10

LINQ进行查询

2009-09-16 11:19:48

Linq Select

2009-11-19 13:44:29

Oracle FROM

2010-04-02 15:04:14

Oracle递归查询

2009-09-15 15:18:40

Linq连接查询

2009-09-14 18:23:59

LINQ嵌套查询

2010-09-26 14:40:25

SQL FROM子句

2010-11-09 10:10:08

SQL Server

2009-09-15 16:44:44

Linq排序

2009-09-15 11:34:47

Linq多条件查询

2009-09-14 19:14:51

LINQ动态查询

2009-09-17 09:45:36

LINQ查询语句

2009-09-13 21:52:16

LINQ字符串

2009-09-17 08:47:00

Linq查询

2009-08-27 10:22:40

LINQ查询
点赞
收藏

51CTO技术栈公众号