LINQ及各种连接样件

本文关键字:连接 及各种 LINQ | 更新日期: 2023-09-27 17:50:03

我正在学习LINQ。首先我需要熟悉linq的联接。我用linq搜索左外连接和右外连接我得到的答案是

左外连接

var LeftJoin = from emp in ListOfEmployees
join dept in ListOfDepartment
on emp.DeptID equals dept.ID into JoinedEmpDept 
from dept in JoinedEmpDept.DefaultIfEmpty()
select new                          
{
EmployeeName = emp.Name,
DepartmentName = dept != null ? dept.Name : null                          
};

右外连接

var RightJoin = from dept in ListOfDepartment
join employee in ListOfEmployees
on dept.ID equals employee.DeptID into joinDeptEmp
from employee in joinDeptEmp.DefaultIfEmpty()
select new                            
{
EmployeeName = employee != null ? employee.Name : null,
DepartmentName = dept.Name
};

从那时的代码,我只是不能理解它是如何左外连接,因为没有左外关键字是在这里使用。所以请告诉我如何理解连接是左外连接还是右外连接。

当我将使用linq,那么如何像操作符可以使用。'a%' or '%a' or '%a%'。我看到有一个包含方法有点不同。

请讨论这两个问题。由于

LINQ及各种连接样件

LINQ查询语法的"join ... in ... on ... into"段,被翻译成GroupJoin()段。

GroupJoin()方法,对于外部列表(或表)中的每个键,返回内部列表(或表)中具有相同键的元素的列表,或者如果该键不存在则返回空列表。

因此,问题的左外部连接代码更清晰:

如果JoinedEmpDept(即与当前检查的外列表项具有相同键的元素列表)为空,则dept被设置为空(由于DefaultIfEmpty()方法)。

伪代码翻译:
for each employee in ListOfEmployees  
get the list of dept having ID equal to empl.DeptID   
and set them into JoinedEmpDept  
then for each dept in JoinedEmpDept 
(if empty iterates over a single null dept)  
returns an new element containing:
employee.Name and dept.Name (or null if dept is null) 

右外连接,基本上是一个左外连接,外部列表和内部列表交换。


关于"like"问题,'%a%'string.Contains("a"), 'a%'string.StartsWith("a"), '%a'string.EndsWith("a")

的例子:

var query = from el in listOfStrings
            where el.StartsWith("AB")
            select el;
编辑:

关于IN()操作符问题…
你也可以使用Contains(),或者Any():

var inGroup = new []{ "Foo", "Bar" };
var query1 = from el in listOfStrings
             where inGroup.Contains(el)
             select el;
// or equally
var query2 = from el in listOfStrings
             where inGroup.Any(x => el.Equals(x))
             select el;

左外连接是这样的,因为这一行:

from dept in JoinedEmpDept.DefaultIfEmpty()

将得到所有的员工,即使他们不在一个部门。当生成SQL时,DefaultIfEmpty将连接转换为左外连接。

c#: Left outer join with LINQ

左连接而不是:

from user in tblUsers
join compTmp1 in tblCompanies
  on user.fkCompanyID equals compTmp1.pkCompanyID into compTmp2
from comp in compTmp2.DefaultIfEmpty()

你可以写:

from user in tblUsers
from comp in tblCompanies.Where(c => c.pkCompanyID == user.fkCompanyID).DefaultIfEmpty()