实体框架选择仅包含一个孩子的人

Posted

技术标签:

【中文标题】实体框架选择仅包含一个孩子的人【英文标题】:entity framework select person with iunclude only one child 【发布时间】:2016-02-22 12:39:00 【问题描述】:

假设我有一个包含子列表的 Person 类。

我不想查询数据库以获取包含孩子的人员列表:

return context.Person.Include(p => p.Children);

好的,现在我想修改那个查询,结果我得到了 Person 列表,但只有一个孩子(假设是最老的一个,按年龄 desc 排序)

有可能吗?

提前致谢

【问题讨论】:

检查此答案***.com/a/16501677/2224701,但不要指望通过person.Children 集合获得那个孩子,它将是new person, child 【参考方案1】:

您所描述的可以通过这样的查询来实现:

from p in Persons
from ch in p.Children.OrderByDescending(x => x.Age).Take(1)
select new  p,ch 

您也可以使用FirstOrDefault(),而不是Take(1):结果集也将包括没有孩子的人:

from p in Persons
select new  p, p.Children.OrderByDescending(x => x.Age).FirstOrDefault() 

但是,Person 类的集合 Children 会自动维护为 1 个 Person 实例的所有 Children 的集合,并且无法更改此含义。

据我所知,这是不可能的,您需要创建一个包含 1 个 Person + 1 个 Child 实例的新类。

【讨论】:

【参考方案2】:

我为这种情况创建了一个库。

https://github.com/deyunote/EntityFramework.Include

使用这个库,你可以描述如下

context.Person.Include(p => p.Children,
                       p => p.Children.OrderByDescending(x => x.Age).Take(1).ToList())
              .ToListWithInclude(); //Async:ToListWithAsync()

【讨论】:

以上是关于实体框架选择仅包含一个孩子的人的主要内容,如果未能解决你的问题,请参考以下文章

选择所有子项仅包含相同值且没有其他方案的行

实体框架:如何从相关实体中选择特定列

Spring Data Jpa:保存方法仅返回选择,但不执行插入

JPA双向实体:在查询父实体时仅选择子实体的子集

从表中选择所有类型的实体,但仅限于派生实体的成员

实体框架仅日期属性格式