如何在Entity Framework的Select语句中填充多行关联数据?
解决方法
你的问题出在查询用了交叉连接(两个from),导致每个用户和对应的公司是一对一配对,没法直接得到公司列表,而且c是单个Company实例,调用c.Select本身就是错误的。另外如果用了手动投影(new User()),EF的Include方法会被忽略,因为它只对完整跟踪的实体生效。
下面是两种可行的解决方式:
方式一:用GroupJoin分组获取公司列表
通过GroupJoin将用户和对应的公司分组,直接构造包含公司列表的User对象:
var list = await context.User .Where(x => ids.Contains(x.UserId)) .GroupJoin( context.Company, user => user.UserId, company => company.UserId, (user, companies) => new User() { UserId = user.UserId, // 这里根据实际需求填充Company的属性 Companies = companies.Select(c => new Company() { CompanyId = c.CompanyId, CompanyName = c.CompanyName, UserId = c.UserId // 其他需要的属性 }).ToList() }) .ToListAsync(token);
方式二:利用EF导航属性(如果已配置)
如果你的User实体类中已经定义了和Company的一对多导航属性(比如public ICollection<Company> Companies { get; set; }),且EF已经正确配置了关系,那么可以直接用Include,但注意不要手动投影new User(),否则Include会失效:
// 确保User类有正确的导航属性 var list = await context.User .Include(u => u.Companies) .Where(x => ids.Contains(x.UserId)) .ToListAsync(token);
关键说明
- 你原来的代码中,
from c in context.Company.Where(...)会让每个用户和每个关联公司生成一条记录,重复创建User对象,无法得到单个用户对应多个公司的列表。 - 当你手动创建
new User()时,EF会认为你在做投影查询,这时候Include会被忽略,因为它只对EF跟踪的完整实体对象生效。
内容的提问来源于stack exchange,提问作者JonnyJon44
相关产品推荐
相关产品推荐

