gpt4 book ai didi

c# - Entity Framework 过滤器嵌套集合

转载 作者:太空宇宙 更新时间:2023-11-03 18:26:18 24 4
gpt4 key购买 nike

我有一个实体关系图如下。

类实体:

public int id
public int std
public virtual ICollection<StudentEntity> students

学生实体:

public int id
public string name
public string gender
public virtual ClassEntity class
public virtual StudentAddressEntity studentAddress

StudentAddressEntity:

public int id
public string address

我需要获取类(class)及其男童。

var classEntity = dbContext.Set<ClassEntity>().Where(t => t.id == classId);
var query = classEntity.Include(c => c.students.Select(s => s.studentAddress))
.FirstOrDefault(c => c.students.Any(s => s.gender == GenderEnum.Male));

但它正在返回所有学生的类(class)。如何只过滤男学生?

最佳答案

我过去曾使用联接来完成类似的结果。例如,我有地址嵌套 (1:M) 的帐户。例如,如果我想获取属于某个特定国家/地区的所有帐户,我会使用如下连接:

(from a in accountRepo.GetAll()
join aa in accountAddressRepo.GetAll() on a.AccountId equals aa.AccountId
join ad in addressRepo.GetAll() on aa.AddressId equals ad.AddressId
where ad.CountryId == codeCountryId
select a).ToList();

如果您不使用存储库模式,您可以简单地将 accountRepo.GetAll() 替换为 DbContext.Set()。

在您的情况下,您应该能够加入 Student、Address 和 Class 实体并获得类似的结果。像下面这样的东西应该适合你:

(from s in DbContext.Set<StudentEntity>
join a in DbContext.Set<StudentAddressEntity> on s.studentAddress.id equals a.id
join c in DbContext.Set<ClassEntity> on s.class.id equals c.id
where c.std == classId && s.gender== GenderEnum.Male
select s).ToList();

请注意,这是基于我对您的数据库和实体名称的理解的简单表示。您可能需要稍微调整此查询以使其可编译,但基本思想应该适合您。请告诉我它是如何为您工作的。

关于c# - Entity Framework 过滤器嵌套集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33693618/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com