我有一个实体关系图如下。
类实体:
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();
请注意,这是基于我对您的数据库和实体名称的理解的简单表示。您可能需要稍微调整此查询以使其可编译,但基本思想应该适合您。请告诉我它是如何为您工作的。
