[英]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
相同的实体领域。 我想Departments
与Description
的领域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.