我刚刚学习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%'
。我看到有一种方法有点不同。
请讨论这两个问题。感谢
答案 0 :(得分:2)
"join ... in ... on ... into"
LINQ查询语法,被翻译成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”问题,您应该string.Contains("a")
使用'%a%'
,string.StartsWith("a")
使用'a%'
,string.EndsWith("a")
'%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;
答案 1 :(得分:1)
由于这一行,左外连接是这样的:
from dept in JoinedEmpDept.DefaultIfEmpty()
即使他们不在某个部门,也会得到所有员工。生成SQL时,DefaultIfEmpty
将连接转换为左外连接。
有关详细信息,请参阅此博客文章:C#: Left outer joins with LINQ
答案 2 :(得分:1)
左连接提示, 而不是:
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()