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查询语法的"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
将连接转换为左外连接。
左连接而不是:
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()