【发布时间】:2019-03-18 17:30:45
【问题描述】:
我想在实体框架 select 语句中仅选择 CFO 以下的子实体及其子实体。
这是我的桌子:
+-------+------------+----------+
| OrgId | Name | ParentId |
+-------+------------+----------+
| 1 | COO | |
+-------+------------+----------+
| 2 | CFO | |
+-------+------------+----------+
| 3 | Accountant | 2 |
+-------+------------+----------+
| 4 | Bookkeeper | 3 |
+-------+------------+----------+
| 5 | Controller | 2 |
+-------+------------+----------+
| 6 | Operations | 1 |
+-------+------------+----------+
我只想选择这个:
+-------+------------+----------+
| OrgId | Name | ParentId |
+-------+------------+----------+
| 3 | Accountant | 2 |
+-------+------------+----------+
| 4 | Bookkeeper | 3 |
+-------+------------+----------+
| 5 | Controller | 2 |
+-------+------------+----------+
实体框架选择:
public virtual IList<OrgStructureModel> GetAll()
{
using (var db = _context)
{
var result = _session.GetObjectFromJson<IList<OrgStructureModel>>("OrgStructure");
if (result == null)
{
result = db.OrgStructures
.Select(org => org.ToOrgStructureModel(db.OrgStructures.Where(s => s.ParentId == org.OrgId).Count() > 0))
.ToList();
_session.SetObjectAsJson("OrgStructure", result);
}
return result;
}
}
如何在 EF 中实现这一点?
这是我尝试过的
我已经尝试过测试只显示孩子与任何父母.Where(e => e.ParentId != null):
result = db.OrgStructures
.Select(org => org.ToOrgStructureModel(db.OrgStructures.Where(s => s.ParentId == org.OrgId).Count() > 0))
.Where(e => e.ParentId != null)
.ToList();
但这返回了 0 个结果
ToOrgStructureModel的定义:
public static OrgStructureModel ToOrgStructureModel(this OrgStructure org, bool hasChildren)
{
return new OrgStructureModel
{
OrgId = org.OrgId,
ParentId = org.ParentId,
Name = org.Name
hasChildren = hasChildren
};
}
更新:
上面的查询有数据的 Telerik TreeList 控件似乎有问题,但该控件不会输出数据。但问题仍然存在,我如何使用 LINQ 获得OrgId: 3,4,5?
【问题讨论】:
-
可以使用LINQ的join方法
-
如果有人有例子,那就太好了,谢谢!
-
这不是 where parentid == null 那么吗?
-
如果我选择
OrgId: 2,我应该返回OrgId: 3, 5还是OrgId: 3, 4, 5?第一个答案很简单,第二个答案是不可能的,因为它需要Recursive CTE which Entity-Framework does not support (linq nor lambda)。 -
@ErikPhilips 应该回复
OrgId: 3,4,5。编辑后:我看到它是这样存储的过程!
标签: c# entity-framework