Skip to main content
 首页 » 编程设计

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

2024年01月24日25落叶无声

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

类实体:

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(); 

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