EF左连接查询时如何直接为Member未映射的IsActive属性赋值无需投影
实现方案
现有EF Core版本完全可以满足你的需求,以下是两种最常用的简便实现,都不需要手动为Member的所有属性逐一赋值:
方案1:匿名对象过渡+内存赋值(兼容所有EF Core版本,无额外依赖)
先通过EF Core查询获取Member实体引用和关联User的存在状态,实体化后在内存中直接给IsActive属性赋值即可,全程不需要操作Member的其他字段:
var members = (from m in _dbContext.Members join u in _dbContext.Users on m.MemberId equals u.MemberId into userGroup from u in userGroup.DefaultIfEmpty() select new { Member = m, IsActive = u != null }) .AsEnumerable() // 后续逻辑转为内存执行,不会被翻译为SQL .Select(x => { x.Member.IsActive = x.IsActive; return x.Member; }) .Distinct() // 单个Member对应多条User记录时避免重复返回 .ToList();
该方案无需修改现有实体映射,IsActive带有[Ignore]特性,赋值后调用SaveChanges也不会将该值写入数据库,完全安全。
方案2:导航属性+AutoMapper投影(适合高频使用该查询的场景)
如果你已经配置了Member到User的导航属性:
public class Member { public int MemberId { get; set; } [Ignore] public bool IsActive { get; set; } // 新增导航属性,配置好关系即可,不需要修改数据库结构 public ICollection<User> Users { get; set; } ... }
只需要在AutoMapper配置中添加IsActive的映射规则,其余字段AutoMapper会自动匹配映射:
CreateMap<Member, Member>() .ForMember(dest => dest.IsActive, opt => opt.MapFrom(src => src.Users.Any()));
查询时直接调用ProjectTo即可一步得到赋值完成的Member集合:
var members = _dbContext.Members .ProjectTo<Member>(_mapper.ConfigurationProvider) .ToList();
内容的提问来源于stack exchange,提问作者Milan
相关产品推荐
相关产品推荐

