LINQ基础之Join和UNION子句

Join子句

一、简介

使用join子句可以将来自不同源序列并且在对象模型中没有直接关系的元素相关联,唯一的要求是每个源中的元素需要共享某个可以进行比较以判断是否相等的值,join子句使用特殊的equals关键字比较指定的键是否相等。

二、案例

内部连接

var innerJoinQuery =
              from category in categories
              join prod in products on category.ID equals prod.CategoryID
                      select new { ProductName = prod.Name, Category = category.Name };

分组连接

var innerGroupJoinQuery =
 from category in categories
 join prod in products on category.ID equals prod.CategoryID
 into prodGroup
 select new { CategoryName = category.Name, Products = prodGroup };

左外部连接

var leftOuterJoinQuery =
             from category in categories
             join prod in products on category.ID equals prod.CategoryID
             into prodGroup
                     from item in prodGroup.DefaultIfEmpty(new Product{Name =
             string.Empty, CategoryID = 0})
                     select new { CatName = category.Name, ProdName = item.Name };

分析:

在左外连接中,将返回左侧源序列中的所有元素,即使它们在右侧序列中没有匹配的元素也是如此。
若要在Linq中执行左外连接,请将DefaultIfEmpty方法与分组连接结合起来,以指定要在某个元素不具有匹配元素时产生的默认右侧元素,可以使用null作为任何引用类型的默认值。也可以指定用户定义的默认类型。

UNION子句

一、简介

Union返回并集,并集是指位于两个集合中任一集合的唯一的元素(自动去重复了)。在LINQ中UNION默认是去重的,没有UNION ALL 语句,不去重用CONCAT()。

二、案例

1.查询语句写法

Union会去除重复项,相当于SQL的Union

var q = (from c in db.Customers
         select c.Country
           ).Union(from e in db.Employees
                   select e.Country
           );

相当于

var q1 = from s in db.Student
                        where s.ID < 3
                        select s;
var q2 = from s in db.Student
                        where s.ID < 5
                        select s;

 //去掉重复的
var q = q1.Union(q2);
var r = q.ToList();//ToList之后,会把数据查出来在内存中操作

如果不去重,用Concat()

//Concat不会去除重复项目,相当于SQL的Union All;
//不去掉重复的 相当于union all,
var q3 = q1.Concat(q2);
var r3 = q3.ToList()

2.另一种写法

var q = db.Customers.Union(db.Employees).select(d=>d.Country);

到此这篇关于LINQ使用Join和UNION子句的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • c#中LINQ的基本用法(三)

    一.并行LINQ System.Linq名称空间中包含的类ParallelEnumerable可以分解查询的工作,使其分布在多个线程上.尽管Enumerable类给IEnumerable<T>接口定义了扩展方法,但ParallelEnumerable类的大多数扩展方法是ParallerQuery<TSource>类的扩展.例如,AsParallel()方法,它扩展了IEnumerable<T>接口,返回ParallelQuery<T>类,所以正常的集合类可以

  • linq中的分区操作符

    Linq中的分区指的是在不重新排列元素的情况下,将输入序列划分为两部分,然后返回其中一个部分的操作. 一.Take操作符 Take(int n)表示将从序列的开头返回数量为n的连续元素,常用于分页.其定义如下: public static IEnumerable<TSource> Take<TSource>(this IEnumerable<TSource> source, int count); 该方法只接受一个整数,表示要返回的结果的数量. 看下面的例子: usin

  • c#中LINQ的基本用法(二)

    目录 1.筛选 2.用索引筛选 3.类型筛选 4.复合的from子句 5.排序 6.分组 7.对嵌套的对象分组 8.内连接 9.左连接 10.组连接 11.集合操作 12.合并 13.分区 14.聚合操作符 15.转换操作符 16.生成操作符 本文主要介绍LINQ查询操作符 LINQ查询为最常用的操作符定义了一个声明语法.还有许多查询操作符可用于Enumerable类.下面的例子需要用到LINQ基础(一)(https://www.jb51.net/article/244208.htm)的一些代码

  • c#中LINQ的基本用法(一)

    LINQ(Language Integrated Query,语言集成查询),在C#语言中集成了查询语法,可以用相同的语法访问不同的数据源.LINQ提供了不同数据源的抽象层,所以可以使用相同的语法.这里主要介绍LINQ的核心原理和C#中支持C# LINQ查询的语言扩展. 1.语法 使用LINQ查询出来自巴西的所以世界冠军.这里可以使用List<T>类的FindAll()方法,但使用LINQ查询语法更简单 static void LINQQuery() { // var query = from

  • linq中的元素操作符

    目录 一.Fitst操作符 二.FirstOrDefault操作符 三.Last操作符 四.LastOrDefault操作符 五.ElementAt操作符 六:ElementAtOrDefault操作符 七.Single操作符 1.序列包含多个元素 2.序列中不包含任何元素. 八.SingleOrDefault操作符 1.序列包含多个元素 2.序列不包含任何元素 元素操作符仅返回一个元素. 一.Fitst操作符 First操作符将返回序列中的第一个元素.如果序列中不包含任何元素,则First<T

  • linq中的连接操作符

    linq中的连接操作符主要包括Join()和GroupJoin()两个. 一.Join()操作符 Join()操作符非常类似于T-SQL中的inner join,它将两个数据源进行连接,根据两个数据源中相等的值进行匹配.例如:可以将产品表和产品类别表进行连接,得到产品名称和与其对应的类型名称.下面看看Join()方法的定义: public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(this IEn

  • linq中的串联操作符

    串联是一个将两个集合连接在一起的过程.在Linq中,这个过程通过Concat操作符实现.Concat操作符用于连接两个集合,生成一个新的集合.来看看Concat操作符的定义: public static IEnumerable<TSource> Concat<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second) 从方法定义中可以看出:第二个参数为输入一个新的集合,与调用集

  • linq中的分组操作符

    分组是根据一个特定的值将序列中的元素进行分组.LINQ只包含一个分组操作符:GroupBy.GroupBy操作符类似于T-SQL语言中的Group By语句.来看看GroupBy的方法定义: public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey>

  • linq中的限定操作符

    限定操作符运算返回一个Boolean值,该值指示序列中是否有一些元素满足条件或者是否所有元素都满足条件. 一.All操作符 All方法用来确定是否序列中的所有元素都满足条件.看下面的例子: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LimitOperation { class Progra

  • linq中的聚合操作符

    目录 一.Aggregate操作符 二.Average操作符 1.直接求基本类型集合的平均值 2.求listProduct集合中价格的平均值 三.Count操作符 四.LongCount操作符 五.Max操作符 六.Min操作符 七.Sum操作符 一.Aggregate操作符 Aggregate操作符对集合值执行自定义聚合运算.来看看Aggregate的定义: public static TSource Aggregate<TSource>(this IEnumerable<TSourc

  • linq中的转换操作符

    这些转换操作符将集合转换成数组:IEnumerable.IList.IDictionary等.转换操作符是用来实现将输入对象的类型转变为序列的功能.名称以"As"开头的转换方法可更改源集合的静态类型但不枚举(延迟加载)此源集合.名称以"To"开头的方法可枚举(即时加载)源集合并将项放入相应的集合类型. 一.AsEnumerable操作符 所有实现了IEnumerable<T>接口的类型都可以调用此方法来获取一个IEnumerable<T>集合

  • LINQ基础之From和GroupBy子句

    FROM子句 一.简单FROM子句 获取数据源: var queryAllCustomers = from cust in Customers select cust; 分析: 查询表达式必须以from子句开头例子中cust是范围变量,范围变量类似于foreach循环中的迭代变量,但在查询表达式中,实际上不发生迭代.执行查询时,范围变量将用作对Customers中的每个后续元素的引用.因为编译器可以推断cust的类型,所以不必显示指定此类型.Customers是数据源,实现了IEnumerabl

随机推荐