LINQ和各种加入样品

时间:2011-04-14 11:33:29

标签: c# linq

我刚刚学习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%'。我看到有一种方法有点不同。

请讨论这两个问题。感谢

3 个答案:

答案 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()