问题描述
|
我只是学习LINQ。所以首先我需要熟悉与linq的联接。我用linq在google中搜索左外部和右外部联接,我得到了像这样的答案
左外连接
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%\'
。我看到有包含方法,有点不同。
请讨论两个问题。谢谢
解决方法
\"join ... in ... on ... into\"
的LINQ查询语法被转换为a4ѭ。
GroupJoin()
方法,对于外部列表(或表)中的每个键,返回内部列表(或表)中具有相同键的元素列表,如果不存在此键,则返回一个空列表。
因此,您问题的左外部联接代码更加清晰:
如果“ 6”(即与当前检查的外部列表条目具有相同键的元素列表)为空,则将“ 7”设置为空(由于使用“ 8”方法)。
伪代码翻译:
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)
相反,右外部联接基本上是左外部联接,其中交换了外部和内部列表。
关于“喜欢”问题,对于use11ѭ,应使用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()
即使所有员工不在部门中,也可以得到所有员工。 generated22ѭ在生成SQL时将联接转换为左外部联接。
有关更多详细信息,请参见此博客文章:C#:左外部与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()