Linq主从表查询仅返回1条明细行,求解决办法
问题分析与解决办法
核心问题排查
- 你直接将
tb1(未执行的IQueryable查询对象)添加到List<object>中返回,导致主从数据的结构被额外包裹,且EF可能未完整枚举明细数据,仅返回了部分结果。 - 明细查询的关联条件仅依赖
SLSREP == SALES_CODE,缺少更精准的关联维度(比如主表的INGESTION_DATE),可能导致明细数据匹配不全。
修正后的代码
先执行查询枚举结果,确保明细数据被完整加载,同时优化关联条件:
var tb1 = ( from a in db.DSCom_t_summary_performance_sales where a.SALES_CODE == User.Identity.Name select new { a.INGESTION_DATE, a.SALES_CODE, a.STATUS, a.POSITION, a.DIVISION, a.DEPARTMENT, a.JML_SO, a.JML_NAB, a.JML_REVENUE, a.JML_ACCOUNT_PAID, // 补充日期关联,确保主从表数据一一对应 details = db.DSCom_t_data_detail_performance_sls_sally .Where(d => d.SLSREP == a.SALES_CODE && d.INGESTION_DATE == a.INGESTION_DATE) .ToList() }).ToList(); // 执行查询,确保所有主从数据被加载 // 直接返回主表数据列表,无需额外包裹 return tb1.AsQueryable();
性能优化建议
如果使用EF Core,建议通过导航属性+Include来避免N+1查询问题:
// 前提:主表实体已配置与明细表的导航属性(比如命名为Details) var tb1 = db.DSCom_t_summary_performance_sales .Where(a => a.SALES_CODE == User.Identity.Name) .Include(a => a.Details) .Select(a => new { a.INGESTION_DATE, a.SALES_CODE, a.STATUS, a.POSITION, a.DIVISION, a.DEPARTMENT, a.JML_SO, a.JML_NAB, a.JML_REVENUE, a.JML_ACCOUNT_PAID, details = a.Details }) .ToList(); return tb1.AsQueryable();
另外,建议检查明细表SLSREP字段的实际数据,确认是否与主表SALES_CODE完全匹配,排除数据本身的匹配误差。
内容的提问来源于stack exchange,提问作者Sabilv
相关产品推荐
相关产品推荐

