繁体   English   中英

Linq 加入同一实体

[英]Linq Join Same Entity

我有一个关于使用 LINQ 加入同一实体的问题。

Department实体:

public class Department
{
    public int DepartmentId { get; set; }
    [MaxLength(250), Column(TypeName = "varchar")]
    public string Description { get; set; }
    public int? ParentDepartmentId { get; set; }
    public DateTime CreatedDate { get; set; }
    public DateTime UpdatedDate { get; set; }
    public virtual ICollection<DepartmentUser> GetDepartmentUsers { get; set; }

    public Department()
    {
        CreatedDate = DateTime.Now;
        UpdatedDate = DateTime.Now;
    }
}

有之间的关系ParentDepartmentId的场Department entitiy和DepartmantId相同的实体领域。 我想DepartmentsDescription的领域ParentDepartment与LINQ查询。 我运行以下代码,但它返回零Department s,尽管数据库中有 3 Department s。

using (var context = new AttendanceDBContext())
{
    var departments =
        from d in context.Departments
        join dd in context.Departments on d.ParentDepartmentId equals dd.DepartmentId
        select new DepartmentDTO
        {
            DepartmentId = d.DepartmentId,
            Description = d.Description,
            ParentDepartment = dd.Description,
            UserCount = d.GetDepartmentUsers.Count(),
            CreatedDate = d.CreatedDate,
            UpdatedDate = d.UpdatedDate
        };
    return departments.ToList();
}

DepartmentDTO DTO实体

public class DepartmentDTO
{
    public int DepartmentId { get; set; }
    public string Description { get; set; }
    public string ParentDepartment { get; set; }
    public int UserCount { get; set; }
    public DateTime CreatedDate { get; set; }
    public DateTime UpdatedDate { get; set; }
}

我想这与您试图加入IntÌnt? , 2 种你真的不能像那样一起处理。 我想这个对类似问题的回答会对你有所帮助。 这是来自 MSDN:

在 join 子句中,如果只有一个比较键是可空值类型,您可以在查询表达式中将另一个转换为可空类型。 在以下示例中,假设 EmployeeID 是包含 int? 类型值的列:

void TestMethod(Northwind db)
{
    var query =
        from o in db.Orders
        join e in db.Employees
            on o.EmployeeID equals (int?)e.EmployeeID
        select new { o.OrderID, e.FirstName };
}

你可以在这里阅读完整的解释

左外连接解决了我的问题。

我将 Linq 查询更改为以下内容。

    public List<DepartmentDTO> ListDetail()
    {
        using (var context = new AttendanceDBContext())
        {
            var departments = from d in context.Departments
                              join dd in context.Departments on d.ParentDepartmentId equals dd.DepartmentId into ddd
                              from dddd in ddd.DefaultIfEmpty()
                              select new DepartmentDTO
                              {
                                  DepartmentId = d.DepartmentId,
                                  Description = d.Description,
                                  ParentDepartment = dddd.Description,
                                  UserCount = d.GetDepartmentUsers.Count(),
                                  CreatedDate = d.CreatedDate,
                                  UpdatedDate = d.UpdatedDate
                              };
            return departments.ToList();
        }
    }

查询结果如图

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM