如何在LINQ中查询主表全字段及关联表指定字段并实现扁平输出
LINQ 实现扁平化多表投影方案
通用方案(兼容所有LINQ场景,推荐数据库查询使用)
你之前的写法是将整个table1实体作为单个属性放入匿名类型,自然会生成嵌套结构。要得到和SQL一致的扁平结构,直接将table1的所有需要的字段逐个显式声明在匿名类型的根层级即可:
// 关联查询示例 var result = from t1 in table1 join t2 in table2 on t1.关联Id equals t2.关联Id select new { t1.address, t1.religion, t1.columnN, // 此处补全table1所有需要返回的字段 name = t2.column1 };
这个写法生成的SQL完全等价于你需要的select table1.*, table2.column1 as name逻辑,没有多余查询开销,也不会出现嵌套结构。
简化方案(仅EF Core 7+支持)
如果使用的是EF Core 7及以上版本,可以用内置的属性扩展语法避免手动列出所有table1字段:
var result = table1 .Join(table2, t1 => t1.关联Id, t2 => t2.关联Id, (t1, t2) => new { t1, Name = t2.column1 }) .Select(x => x.t1.SetProperty(y => y.name, x.Name));
内存场景方案(适用于LINQ to Objects)
如果数据已经加载到内存中,不想手动写大量字段映射,可以用AutoMapper这类对象映射工具自动合并属性:
// 预先配置映射规则 var mapper = new MapperConfiguration(cfg => cfg.CreateMap<Table1Entity, OutputDto>().ForMember(d => d.name, opt => opt.Ignore()) ).CreateMapper(); // 查询后合并属性 var flatResult = queryResult.Select(item => { var dto = mapper.Map<OutputDto>(item.table1); dto.name = item.table2.column1; return dto; });
注意:该方案仅适合内存数据处理,不要在数据库查询阶段使用,否则会触发全表加载导致性能问题。
内容的提问来源于stack exchange,提问作者Fachrul Rozi
相关产品推荐
相关产品推荐

