在查询语言中,通常需要使用联接操作。在 LINQ 中,可以通过 join 子句实现联接操作。join 子句可以将来自不同源序列,并且在对象模型中没有直接关系(数据库表之间没有关系)的元素相关联,唯一的要求是每个源中的元素需要共享某个可以进行比较,以判断是否相等的值。

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

1、内部连接(相对于sql:join | inner join)

格式:join element in dataSource on exp1 equals exp2

int[] intAry1 = {, , , , , };//创建整数数组 intAry1 作为数据源
int[] intAry2 = {, , , , , , };//创建整数数组 intAry2 作为数据源
//查询 query1 使用 join 子句从两个数据源获取数据
//演示内部联接的使用
var query1 =
from val1 in intAry1
join val2 in intAry2 on val1% equals val2%
select new {VAL1=val1, VAL2=val2};

2、分组连接

格式: join element in dataSource on exp1 equals exp2 into grpName

其中,into 关键字表示将这些数据分组并保存到 grpName 中,grpName 是保存一组数据的集合。(感觉和sql不同,sql查询的结果是平面矩形的,而linq则是平面树形的,意思是像对象的元素也是个对象)

int[] intAry1 = { , , , , ,  };//创建整数数组 intAry1 作为数据源
int[] intAry2 = { , , , , , , };//创建整数数组 intAry2 作为数据源
//查询 query1 使用 join 子句从两个数据源获取数据
//演示分组联接的使用
var query1 =
from val1 in intAry1
join val2 in intAry2 on val1 % equals val2 % into val2Grp
select new { VAL1 = val1, VAL2GRP = val2Grp};

3、左外部联接 (相对于sql:left join | left outer join)

第三种联接是左外部联接,它返回第一个集合中的所有元素,无论它是否在第二个集合中有相关元素。在 LINQ 中,通过对分组联接的结果调用 DefaultIfEmpty()方法来执行左外部联接。DefaultIfEmpty()方法从列表中获取指定元素。如果列表为空,则返回默认值。

int[] intAry1 = { , , , , ,  };//创建整数数组 intAry1 作为数据源
int[] intAry2 = { , , , , , , };//创建整数数组 intAry2 作为数据源
//查询 query1 使用 join 子句从两个数据源获取数据
//演示左联接的使用
var query1 =
from val1 in intAry1
join val2 in intAry2 on val1 % equals val2 % into val2Grp
from grp in val2Grp.DefaultIfEmpty()
select new { VAL1 = val1, VAL2GRP = grp };

查询方法Lambda示例(GroupJoin):

原形:https://msdn.microsoft.com/zh-cn/library/bb534297(v=vs.105).aspx

public static IEnumerable<TResult> GroupJoin<TOuter, TInner, TKey, TResult>(
this IEnumerable<TOuter> outer,
IEnumerable<TInner> inner,
Func<TOuter, TKey> outerKeySelector,
Func<TInner, TKey> innerKeySelector,
Func<TOuter, IEnumerable<TInner>, TResult> resultSelector
)

重载

public static IEnumerable<TResult> GroupJoin<TOuter, TInner, TKey, TResult>(
this IEnumerable<TOuter> outer,
IEnumerable<TInner> inner,
Func<TOuter, TKey> outerKeySelector,
Func<TInner, TKey> innerKeySelector,
Func<TOuter, IEnumerable<TInner>, TResult> resultSelector,
IEqualityComparer<TKey> comparer
)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace LinqDemo2
{
/// <summary>
/// 学生实体
/// </summary>
public class Student
{
public int StudentId { get; set; }
public string StudentName { get; set; }
public int StandardId { get; set; }//水平
} /// <summary>
/// 水平/等级
/// </summary>
public class Standard
{
public int StandardId { get; set; }
public string StandardName { get; set; }//
}
class Program
{
static void Main(string[] args)
{
#region 数据源
IList<Student> studentList = new List<Student>()
{
new Student() {StudentId = , StudentName = "John", StandardId = },
new Student() {StudentId = , StudentName = "Moin", StandardId = },
new Student() {StudentId = , StudentName = "Bill", StandardId = },
new Student() {StudentId = , StudentName = "Ram", StandardId = },
new Student() {StudentId = , StudentName = "Ron"}
};
IList<Standard> standardList = new List<Standard>()
{
new Standard() {StandardId = , StandardName = "优秀"},
new Standard() {StandardId = , StandardName = "中等"},
new Standard() {StandardId = , StandardName = "差生"}
};
#endregion //查询公式
var groupJoin = standardList.GroupJoin(studentList,
standard => standard.StandardId,
student => student.StandardId,
(standard, studentGroup) => new
{
StandarFullName = standard.StandardName,
Students = studentGroup
});//感觉和字典类型一样,一个key,对应一个velue, velue = IEnumerable<Student> //执行查询
foreach (var item in groupJoin)
{
Console.WriteLine(item.StandarFullName); foreach (var student in item.Students)
{
Console.WriteLine(student.StudentName);
}
} /* 输出:
*
优秀
John
Moin
中等
Bill
Ram
差生
*/ }
}
}

示例:分页查询

var page = ;
var pageSize = ;
var query = (from user in db.Set<User>()
join userRole in db.Set<UserRole>() on user.Id equals userRole.UserId
join rolePrivilege in db.Set<RolePrivilege>() on userRole.RoleId equals rolePrivilege.RoleId
join priviege in db.Set<Privilege>() on rolePrivilege.PrivilegeId equals priviege.Id
join role in db.Set<Role>() on userRole.RoleId equals role.Id
where user.Id == && userRole.RoleId ==
orderby user.Id descending
select new
{
user.Id,
userRole.RoleId,
user.Username,
PrivilegeName = priviege.Name,
RoleName = role.Name
}).Skip((page - ) * pageSize).Take(pageSize);

Linq 多表连接查询join的更多相关文章

  1. oracle 多表连接查询 join(一)

    一.简介: 多表连接查询通过表之间的关联字段,一次查询多表数据. 下面将依次介绍 多表连接中的如下方法: 1.from a,b 2.inner join 3.left outer join 4.rig ...

  2. oracle 多表连接查询 join

    转 简介: 多表连接查询通过表之间的关联字段,一次查询多表数据. 下面将依次介绍 多表连接中的如下方法: 1.from a,b 2.inner join 3.left outer join 4.rig ...

  3. Linq 中 表连接查询

    public void Test(){ var query = from a in A join b in B on A.Id equals B.Id into c from d in c.Defau ...

  4. 【2017-11-26】Linq表连接查询

    class Program { static void Main(string[] args) { //Linq创建的数据库上下文对象db DataClasses2DataContext db = n ...

  5. SQL表连接查询(inner join、full join、left join、right join)

    SQL表连接查询(inner join.full join.left join.right join) 前提条件:假设有两个表,一个是学生表,一个是学生成绩表. 表的数据有: 一.内连接-inner ...

  6. Hive的join表连接查询的一些注意事项

    Hive支持的表连接查询的语法: join_table: table_reference JOIN table_factor [join_condition] | table_reference {L ...

  7. SQL多表连接查询(详细实例)

    转载博客:joeleo博客(http://www.xker.com/page/e2012/0708/117368.html) 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:stud ...

  8. SQL多表连接查询

    SQL多表连接查询 本文主要列举两张和三张表来讲述多表连接查询. 新建两张表: 表1:student  截图如下: 表2:course  截图如下: (此时这样建表只是为了演示连接SQL语句,当然实际 ...

  9. oracle(sql)基础篇系列(二)——多表连接查询、子查询、视图

        多表连接查询 内连接(inner join) 目的:将多张表中能通过链接谓词或者链接运算符连接起来的数据查询出来. 等值连接(join...on(...=...)) --选出雇员的名字和雇员所 ...

随机推荐

  1. 团队项目之UML图设计---WeEdit

    团队信息: 学号: 姓名: 本次博客链接: 041602209 黄毓明(临时队长)  https://www.cnblogs.com/mingsonic/p/9820702.html 06160023 ...

  2. Hdu1281 棋盘游戏

    棋盘游戏 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  3. hdu 5071 vector操作恶心模拟

    http://acm.hdu.edu.cn/showproblem.php?pid=5071 对于每一个窗口,有两个属性:优先级+说过的单词数,支持8个操作:新建窗口,关闭窗口并输出信息,聊天(置顶窗 ...

  4. 方案dp。。

    最近经常做到组合计数的题目,每当看到这种题目第一反应总是组合数学,然后要用到排列组合公式,以及容斥原理之类的..然后想啊想,最后还是不会做.. 但是比赛完之后一看,竟然是dp..例如前几天的口号匹配求 ...

  5. Spring @Autowired注解用在集合上面,可以保持接口的所有实现类

    CourseService课程接口有2个子类,HistroyCourseServiceImpl和MathsCourseServiceImpl public interface CourseServic ...

  6. .NET Core 微服务之grpc 初体验(干货)

    Grpc介绍 GitHub: https://github.com/grpc/grpc gRPC是一个高性能.通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计 ...

  7. UWP 取消GridView、ListView鼠标选中、悬停效果

    因为经常碰到ListView或者ListBox之类的选中.鼠标悬停样式和自己设置的主题颜色不搭,这时就需要改变这些样式了. 而这里我通过ListView来说明,大致思路其实就是重新定义Item的Tem ...

  8. [转载]Java并发编程:深入剖析ThreadLocal

                原文地址:http://www.cnblogs.com/dolphin0520/p/3920407.html 想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨 ...

  9. Linux巩固记录(6) Hbase环境准备-zookeeper安装

    Hbase是运行在hadoop之上,所以请参考第3篇文章搭建好一个master,两个slave的hadoop环境,我采用的版本为hadoop2.7.4 不了解Hbase的同学可以参考下这篇文章,分析得 ...

  10. activemq在一台服务器上启动多个Broker

    步骤如下: 1.把整个conf文件夹复制一份,比如叫conf2 2.修改里面的activemq.xml文件 ①brokerName不能和原来的重复 ②数据存放的文件名称不能重复,比如<kahaD ...