Entity Framework中如何关联列名不匹配的四张表?
Entity Framework 关联无外键的ExternalData表实现方法
因为你的ExternalData表和其他三张表没有配置外键关联,没法直接用Include加载关联数据,得用手动关联的方式,分两种场景给你写实现:
场景1:需要同时查询出符合条件的ExternalData数据
如果要把Location、Plat、Setting和对应的ExternalData一起返回,可以用Join方法关联:
var result = db.Locations .Include(l => l.Plat) .ThenInclude(p => p.Setting) .Where(l => l.Active == true && l.Plat.Setting.enabledCol == true) // 关联ExternalData表 .Join( db.ExternalData, location => location.PlatId, // 用Location的PlatId关联ExternalData的vId externalData => externalData.vId, (location, externalData) => new { Location = location, ExternalData = externalData } ) // 保留你要求的条件(注:Plat.Id和Location.PlatId实际是相等的,这个条件可简化,按需求保留) .Where(combined => combined.Location.Plat.Id == combined.ExternalData.vId || combined.Location.PlatId == combined.ExternalData.vId) .ToList();
如果一个Plat可能对应多条ExternalData记录,用GroupJoin可以把对应所有ExternalData打包成列表:
var result = db.Locations .Include(l => l.Plat) .ThenInclude(p => p.Setting) .Where(l => l.Active == true && l.Plat.Setting.enabledCol == true) .GroupJoin( db.ExternalData, location => location.PlatId, externalData => externalData.vId, (location, externalDataList) => new { Location = location, ExternalDataList = externalDataList.Where(ed => location.Plat.Id == ed.vId || location.PlatId == ed.vId) } ) .ToList();
场景2:只需要过滤存在符合条件ExternalData的Location
如果不需要返回ExternalData数据,只是要筛选出有对应ExternalData的Location,用Any方法更简洁:
var result = db.Locations .Include(l => l.Plat) .ThenInclude(p => p.Setting) .Where(l => l.Active == true && l.Plat.Setting.enabledCol == true // 检查是否存在匹配的ExternalData && db.ExternalData.Any(ed => ed.vId == l.Plat.Id || ed.vId == l.PlatId)) .ToList();
补充:因为没有外键,EF无法自动生成导航属性,所以只能通过手动指定关联字段的方式来关联表。
内容的提问来源于stack exchange,提问作者MCM13
相关产品推荐
相关产品推荐

