【问题标题】:How to convert this LEFT JOIN Linq Query to Lambda expression如何将此 LEFT JOIN Linq 查询转换为 Lambda 表达式
【发布时间】:2015-11-15 11:35:43
【问题描述】:

如何将左连接 linq 查询转换为 lambda 表达式

var query = from e in db.Employee
join ed in db.EmployeeDetails on e.EmpId equals ed.EmpId into EmpIdInfo
from EmployeeDetails in EmpIdInfo.DefaultIfEmpty()
select new
{
        EmpId = e.EmpId
       ,FirstName = e.FirstName
       ,LastName = e.LastName      
}

【问题讨论】:

  • Employee和EmployeeDetails有什么关系? Employee 类是否包含 EmployeeDetail 类型的属性?我问这个问题是因为在您的查询中您没有在投影 netiher EmpIdInfo 中使用 edvaraible。
  • 关系是 1-1,它们都与 empId 相关
  • 那么您想编写一个查询,只检索具有 EmployeeDetails 的员工,对吧?
  • 不,我想从员工表中检索不在employeedetails中的记录,基本上是左连接
  • 那么这该怎么办(db.Employee.Where(e => e.EmployeeDetails.EmpId == null).Select new { EmpId = e.EmpId ,FirstName = e.FirstName ,LastName = e.LastName }).ToList();

标签: entity-framework linq


【解决方案1】:

如果您想在不使用 Linq 但使用 lambda 表达式的情况下将所有没有相关数据的 Employee 检索到 EmployeeDetails 中,您可以编写以下代码:

db.Employee.Where(e => e.EmployeeDetails.Any() == false).Select(e => new { EmpId = e.EmpId ,FirstName = e.FirstName ,LastName = e.LastName }).ToList()

【讨论】:

    【解决方案2】:

    如果您在数据库中的 Employee 和 EmployeeDetails 之间建立了正确的关系 (FK),并且使用可用的导航属性正确生成了 EF 代码,则以下解决方案应该可以工作。

    如果员工在 EmployeeDetails 中没有对应的记录,则您的 Employee 对象会将嵌入的导航属性 EmployeeDetails 设置为 null。因此,如果您简单地运行以下命令,您应该会很好:

    db.Employee.Where(x => x.EmployeeDetails == null);
    

    请注意,此时我没有计划任何特定属性,因为上面的代码将为您提供在 EmployeeDetails 中没有详细信息的此类员工的列表。因此,这应该对您有用,但您可以选择使用 Select() 进一步过滤正在投影的列。

    如果它对你有用,请告诉我......

    【讨论】:

      猜你喜欢
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多