LINQ to SQL 中 Concat、Union、Intersect、Except 方法的使用

?  前言

LINQ to SQL 中需要对两个或多个数据集进行操作,比如:合并、取交集等,主要使用下面四个方法,这四个方法都是 System.Linq.IQueryable<out T> 接口的扩展方法,并且都是延迟加载方法,下面是使用的简单示例。

?  示例数据,数据表:Subject(科目表)、Score(成绩表)

1.   Concat() 方法

1)   方法声明

public static IQueryable<TSource> Concat<TSource>(this IQueryable<TSource> source1, IEnumerable<TSource> source2);

2)   描述

合并两个数据集,不去重复,对应的 SQL 语句是 UNION ALL。

3)   示例1:获取所有科目Id 和 考试过的科目Id 列表(科目Id 可以重复)

1.   C# 代码

var query = (from t1 in DbContext.Subject

select t1.SubjectId

).Concat(

from t1 in DbContext.Score

select t1.SubjectId

);

var result = query.ToList();

2.   生成SQL

SELECT

[UnionAll1].[SubjectId] AS [C1]

FROM  (SELECT

[Extent1].[SubjectId] AS [SubjectId]

FROM [dbo].[Subject] AS [Extent1]

UNION ALL

SELECT

[Extent2].[SubjectId] AS [SubjectId]

FROM [dbo].[Score] AS [Extent2]) AS [UnionAll1]

3.   执行结果

2.   Union() 方法

1)   方法声明

public static IQueryable<TSource> Union<TSource>(this IQueryable<TSource> source1, IEnumerable<TSource> source2);

2)   描述

合并两个数据集,去重复,对应的 SQL 语句是 UNION ALL + DISTINCT。与想象中似乎不太一样,实际写 SQL 时,一般都会用 UNION 就好了哇。

3)   示例1:获取所有科目Id 和 考试过的科目Id 列表(科目Id 不能重复)

1.   C# 代码

var query = (from t1 in DbContext.Subject

select t1.SubjectId

).Union(

from t1 in DbContext.Score

select t1.SubjectId

);

var result = query.ToList();

2.   生成SQL

SELECT

[Distinct1].[C1] AS [C1]

FROM ( SELECT DISTINCT

[UnionAll1].[SubjectId] AS [C1]

FROM  (SELECT

[Extent1].[SubjectId] AS [SubjectId]

FROM [dbo].[Subject] AS [Extent1]

UNION ALL

SELECT

[Extent2].[SubjectId] AS [SubjectId]

FROM [dbo].[Score] AS [Extent2]) AS [UnionAll1]

)  AS [Distinct1]

3.   执行结果

3.   Intersect() 方法

1)   方法声明(2个重载)

public static IQueryable<TSource> Intersect<TSource>(this IQueryable<TSource> source1, IEnumerable<TSource> source2);

public static IQueryable<TSource> Intersect<TSource>(this IQueryable<TSource> source1, IEnumerable<TSource> source2, IEqualityComparer<TSource> comparer);

2)   描述

取两个数据集的交集(在数据集A出现的记录,并且在数据集B也出现的记录),对应的 SQL 语句是 INTERSECT。

3)   示例1:获取考试过的科目Id

1.   C# 代码

var query = (from t1 in DbContext.Subject

select t1.SubjectId

).Intersect(

from t1 in DbContext.Score

select t1.SubjectId

);

var result = query.ToList();

2.   生成SQL

SELECT

[Intersect1].[SubjectId] AS [C1]

FROM  (SELECT

[Extent1].[SubjectId] AS [SubjectId]

FROM [dbo].[Subject] AS [Extent1]

INTERSECT

SELECT

[Extent2].[SubjectId] AS [SubjectId]

FROM [dbo].[Score] AS [Extent2]) AS [Intersect1]

3.   执行结果

4.   Concat() 方法

1)   方法声明(2个重载)

public static IQueryable<TSource> Except<TSource>(this IQueryable<TSource> source1, IEnumerable<TSource> source2);

public static IQueryable<TSource> Except<TSource>(this IQueryable<TSource> source1, IEnumerable<TSource> source2, IEqualityComparer<TSource> comparer);

2)   描述

取两个数据集的差集(在数据集A出现的记录,在数据集B没出现的记录),对应的 SQL 语句是 EXCEPT。

3)   示例1:获取没有考试过的科目Id

1.   C# 代码

var query = (from t1 in DbContext.Subject

select t1.SubjectId

).Except(

from t1 in DbContext.Score

select t1.SubjectId

);

var result = query.ToList();

2.   生成SQL

SELECT

[Except1].[SubjectId] AS [C1]

FROM  (SELECT

[Extent1].[SubjectId] AS [SubjectId]

FROM [dbo].[Subject] AS [Extent1]

EXCEPT

SELECT

[Extent2].[SubjectId] AS [SubjectId]

FROM [dbo].[Score] AS [Extent2]) AS [Except1]

3.   执行结果

?  总结

简单测试,以备不时之需。

时间: 2024-10-09 06:01:55

LINQ to SQL 中 Concat、Union、Intersect、Except 方法的使用的相关文章

LINQ to SQL语句Concat/Union/Intersect/Except--2017年2月22日

Concat/Union/Intersect/Except操作 适用场景:对两个集合的处理,例如追加.合并.取相同项.相交项等等. Concat(连接) 说明:连接不同的集合,不会自动过滤相同项:延迟. 1.简单形式: var q = ( from c in db.Customers select c.Phone ).Concat( from c in db.Customers select c.Fax ).Concat( from e in db.Employees select e.Home

LINQ to SQL语句(8)之Concat/Union/Intersect/Except

Concat/Union/Intersect/Except操作 适用场景:对两个集合的处理,例 如追加.合并.取相同项.相交项等等. Concat(连接) 说明:连接 不同的集合,不会自动过滤相同项:延迟. 1.简单形式: var q = ( from c in db.Customers select c.Phone ).Concat( from c in db.Customers select c.Fax ).Concat( from e in db.Employees select e.Ho

LINQ TO SQL 中的join(转帖)

http://www.cnblogs.com/ASPNET2008/archive/2008/12/21/1358152.html join对于喜欢写SQL的朋友来说还是比较实用,也比较容易接受的东西.在LINQ TO SQL中,写多表查询,同样可以写join,只是它有它自己的语法要求而已,语义都是一样的,下面我来讲下LINQ TO SQL中的join最基本的形式:都是最简单的,当然还有其它方面的内容,如:怎样加上过滤条件,如何分组,如何排序等等,为了单纯说join的用法,这里就简化下. Cod

Linq To Sql 中未将对象引用设置到对象的实例

我们在DAL对方法进行封装 public void Delete(T entity) { db.GetTable<T>().DeleteOnSubmit(entity); db.SubmitChanges(); } 对stuInfo进行删除 public void Delete(StuInfo stuInfo) { db.Delete(stuInfo); } 这条语句是之前已经插入过的 StuInfo stuinfo = new StuInfo { StuAge = 18, StuNo = &

转:使用linq to sql 随机取一行数据的方法

原文地址:http://outofmemory.cn/code-snippet/1760/usage-linq-to-sql-suiji-take-yixing-data-method 虽然这看来已经不是真正的原文地址了 在linq to sql中我们可以通过创建一个假的用户自定义函数的方法来实现随机取一行数据的方法. 首先要在DataContext的类中添加用户自定义函数,最好是放在partial class中: partial class MyDataContext { [Function(

LINQ体验(8)——LINQ to SQL语句之Union All/Union/Intersect和Top/Bottom和Paging和SqlMethods

我们继续解说LINQ to SQL语句,这篇我们来讨论Union All/Union/Intersect操作和Top/Bottom操作和Paging操作和SqlMethods操作 . Union All/Union/Intersect操作 适用场景:对两个集合的处理,比如追加.合并.取同样项.相交项等等. Concat(连接) 说明:连接不同的集合.不会自己主动过滤同样项:延迟. 1.简单形式: var q = ( from c in db.Customers select c.Phone ).

SQL中的union

在SQL中,如果我们查询一个班级的考试成绩数据,再统计考试成绩的总和,我们使用以下两条语句: select StudentName,Grade from Student select '总成绩',SUM(Grade)from Student 执行此两条代码,结果会分别显示在两个表中,我们该如何使两条数据整合在一起?这就用到了union集合运算符,union对两个集合进行操作,两个集合需要有相同的列名,两个集合的列类型应该是相符的,最终列名以第一个集合列名为准. 我们上面的代码片段恰好符合合并的要

linq to sql中修改连接字符串

如果在类库中在添加linq to sql并连接完数据库服务器后会自动生成settings.settings文件,app.config文件用于存储连接字符串(图一) 如要修改连接字符串要修改哪个还是要全部修改呢?经过我研究发现最简单只需要修改dbml一个文件即可,因为三者是关联的,dbml修改后其他两个文件会相应的修改,但是这是有顺序的:dbml.settings.settings和app.config,修改其中一个连接字符串会将之后文件中的连接字符串同步.否则逆向修改会麻烦一些比如修改了app.

Linq To Sql中实现Left Join与Inner Join使用Linq语法与lambda表达式

当前有两个表,sgroup与sgroupuser,两者通过gKey关联,而sgroup表记录的是组,而sgroupuser记录是组中的用户,因此在sgroupuser中不一定有数据.需要使用Left Join获取数据: Linq语法如下: var sg = (from g in dc.sgroup join gu in dc.sgroupuser on g.gKey equals gu.gKey into l from lgu in l.DefaultIfEmpty() select new {