首页 > 编程语言 >C# 多表联查、InnerJoin、LeftJoin相关问题

C# 多表联查、InnerJoin、LeftJoin相关问题

时间:2022-10-10 09:58:43浏览次数:57  
标签:Extent3 多表 Extent1 Limit1 C# UserId InnerJoin Id Name

案例一:

Linq代码如下:

var loginUser = (from u in _systemUserRepository.Table
                             join ur in _systemUserRoleRepository.Table on u.Id equals ur.UserId
                             join r in _systemRoleRepository.Table on ur.RoleId equals r.Id
                             join ula in _systemUserRelaRepository.Table on u.Id equals ula.UserId
                             where u.Account == account && u.Password == password
                             select new SystemUserLoginDTO()
                             {
                                 Id = u.Id,
                                 Account = u.Account,
                                 Name = u.Name,
                                 RoleId = r.Id,
                                 RoleType = r.RoleType,
                                 EmployeeId = ula.RelaId
                             }).FirstOrDefault();

生成如下SQL脚本:

SELECT 
    [Limit1].[RoleType] AS [RoleType], 
    [Limit1].[Id] AS [Id], 
    [Limit1].[Account] AS [Account], 
    [Limit1].[Name] AS [Name], 
    [Limit1].[Id1] AS [Id1], 
    [Limit1].[RelaId] AS [RelaId]
    FROM ( SELECT TOP (1) 
        [Extent1].[Id] AS [Id], 
        [Extent1].[Account] AS [Account], 
        [Extent1].[Name] AS [Name], 
        [Extent3].[Id] AS [Id1], 
        [Extent3].[RoleType] AS [RoleType], 
        [Extent4].[RelaId] AS [RelaId]
        FROM    [dbo].[SystemUser] AS [Extent1]
        INNER JOIN [dbo].[SystemUserRole] AS [Extent2] ON [Extent1].[Id] = [Extent2].[UserId]
        INNER JOIN [dbo].[SystemRole] AS [Extent3] ON [Extent2].[RoleId] = [Extent3].[Id]
        INNER JOIN [dbo].[SystemUserRela] AS [Extent4] ON [Extent1].[Id] = [Extent4].[UserId]
        WHERE [Extent1].[Account] = 'admin' AND [Extent1].[Password] = 'd42683b3df678c61'
    )  AS [Limit1]

案例二:

Linq代码如下:

 var empDept = (from e in _employeeRepository.Table
                                   join ul in _systemUserRelaRepository.Table on e.Id equals ul.RelaId
                                   join d in _departmentRepository.Table on e.DeptId equals d.Id
                                   join p in _positionRepository.Table on e.PositionId equals p.Id into pJoin
                                   from pTemp in pJoin.DefaultIfEmpty()
                                   where ul.UserId == loginUser.Id && ul.RelaTableName == "HREmployee"
                                   select new EmployeeDeptDTO()
                                   {
                                       DeptId = d.Id,
                                       DeptName = d.DeptName,
                                       DeptCode = d.DeptCode,
                                       PositionId = pTemp.Id,
                                       PositionName = pTemp.Name
                                   }).FirstOrDefault();

生成如下SQL脚本:

SELECT 
    [Limit1].[C1] AS [C1], 
    [Limit1].[Id] AS [Id], 
    [Limit1].[DeptName] AS [DeptName], 
    [Limit1].[DeptCode] AS [DeptCode], 
    [Limit1].[Id1] AS [Id1], 
    [Limit1].[Name] AS [Name]
    FROM ( SELECT TOP (1) 
        [Filter1].[Id1] AS [Id], 
        [Filter1].[DeptCode] AS [DeptCode], 
        [Filter1].[DeptName] AS [DeptName], 
        1 AS [C1], 
        [Extent4].[Id] AS [Id1], 
        [Extent4].[Name] AS [Name]
        FROM   (SELECT [Extent1].[PositionId] AS [PositionId], [Extent2].[UserId] AS [UserId], [Extent3].[Id] AS [Id1], [Extent3].[DeptCode] AS [DeptCode], [Extent3].[DeptName] AS [DeptName]
            FROM   [dbo].[HREmployee] AS [Extent1]
            INNER JOIN [dbo].[SystemUserRela] AS [Extent2] ON [Extent1].[Id] = [Extent2].[RelaId]
            INNER JOIN [dbo].[HRDepartment] AS [Extent3] ON [Extent1].[DeptId] = [Extent3].[Id]
            WHERE 'HREmployee' = [Extent2].[RelaTableName] ) AS [Filter1]
        LEFT OUTER JOIN [dbo].[HRPosition] AS [Extent4] ON [Filter1].[PositionId] = [Extent4].[Id]
        WHERE ([Filter1].[UserId] = '1489681308820001') OR (([Filter1].[UserId] IS NULL) AND ('1489681308820001' IS NULL))
    )  AS [Limit1]

结论:

1、是否左连接,在于是否使用了 DefaultIfEmpty() 方法,使用了该方法,那么就是一次左连接。不使用该方法时,就是内连接。

2、在使用 DefaultIfEmpty() 方法之前 join 的 表会先内连接查询作为一个整体作为左连接主体,来跟使用了 DefaultIfEmpty() 方法的表进行左连接。

 

 

标签:Extent3,多表,Extent1,Limit1,C#,UserId,InnerJoin,Id,Name
From: https://www.cnblogs.com/edisonxigua/p/16774579.html

相关文章

  • Idea中连接HugeGraph服务器出现NoSuchFieldError: EXCLUDE_EMPTY
    1、发生错误场景(开发环境)importjava.io.IOException;importjava.util.Iterator;importjava.util.List;importjava.util.Map;importcom.baidu.hugegraph.driver......
  • Uncaught TypeError: Converting circular structure to JSON
     在使用JSON.stringify方法去转化成字符串,会报错TypeError:ConvertingcircularstructuretoJSON原因: 对象中有对自身的循环引用; 解决方法:下面的 json_str 就......
  • centos7 中安装java8
     使用yum安装001、查看安装包[root@localhosttest]#cat/etc/redhat-releaseCentOSLinuxrelease7.9.2009(Core)  002、查看java8安装包[root@localho......
  • HugeGraph创建propertyKey出现The name of property key can't be null
    1、发生错误场景(开发环境)importjava.io.IOException;importjava.util.Iterator;importjava.util.List;importjava.util.Map;importcom.baidu.hugegraph.driver......
  • Spark3与CDH6.1.1的集成
    一、编译Spark3.0.3源码1、源码下载https://github.com/apache/spark/archive/refs/tags/v3.0.3.zip2、上传至/opt/soft目录并解压至/opt/moduleunzipspark-3.0.3.zi......
  • MyBatis之ResultMap的association和collection标签详解
    一、前言MyBatis创建时的一个思想是:数据库不可能永远是你所想或所需的那个样子。我们希望每个数据库都具备良好的第三范式或BCNF范式,可惜它们并不都是那样。如果能......
  • Windows下Docker Desktop折腾
    虽然自己有一些docker基础,但一堆东西很难在租的服务器里面部署。所以尝试在win下部署一下docker,也算是打破舒适圈了...提高一下自己的动手能力,感觉做云原生这块离不开docke......
  • 关于synchronized的使用
    Synchronized使用的三种方式:synchronized代码块-----可以指定任意对象,和synchronized方法联用要指向当前对象thissynchronized方法-----this当前对象synchronized静态......
  • WebSocket
    菜鸟教程-WebSocket实时通信一、WebSocket概念WebSocket是HTML5提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。它基于TCP传输协议,并复用HTTP的握......
  • docker gitlab 用户密码重置
    代码按照顺序dockerexec-itgitlabbashsu-gitls进入控制台--以下根据版本两条都试试gitlab-railsconsoleproduction或者gitlab-railsconsole-eproduction......