如何用LINQ Lambda实现按LocationId列表查询关联的Matrix记录
问题解决:关联查询的LINQ Lambda等价写法
需求概述
Matrix与Location为父子架构,通过中间表LocationMatrices关联。需传入一组LocationId整数列表,返回对应的Matrix记录。
已知可正常运行的查询语法LINQ示例
假设你的查询语法代码如下(基于EF上下文):
var targetLocationIds = new List<int> { 101, 102, 103 }; var validMatrices = from matrix in dbContext.Matrices join locationMatrix in dbContext.LocationMatrices on matrix.Id equals locationMatrix.MatrixId where targetLocationIds.Contains(locationMatrix.LocationId) select matrix;
等价的LINQ Lambda写法
写法1:显式Join(与查询语法一一对应)
完全匹配查询语法的Lambda实现,通过Join方法显式关联两张表:
var targetLocationIds = new List<int> { 101, 102, 103 }; var validMatrices = dbContext.Matrices .Join( dbContext.LocationMatrices, matrix => matrix.Id, // 左表(Matrices)的关联键 locationMatrix => locationMatrix.MatrixId, // 右表(LocationMatrices)的关联键 (matrix, locationMatrix) => new { Matrix = matrix, LocationMatrix = locationMatrix } // 关联后返回的临时对象 ) .Where(joined => targetLocationIds.Contains(joined.LocationMatrix.LocationId)) // 过滤符合条件的LocationId .Select(joined => joined.Matrix); // 最终返回Matrix记录
写法2:利用导航属性简化(更简洁)
如果你的Matrix实体已经配置了指向LocationMatrices的导航属性(比如public ICollection<LocationMatrix> LocationMatrices { get; set; }),可以用Any方法简化逻辑,生成的SQL通常更高效:
var targetLocationIds = new List<int> { 101, 102, 103 }; var validMatrices = dbContext.Matrices .Where(matrix => matrix.LocationMatrices .Any(lm => targetLocationIds.Contains(lm.LocationId)));
可选:去重处理
如果一个Matrix关联多个符合条件的Location,上述两种写法可能返回重复的Matrix记录,可添加Distinct()去重:
// 写法1添加去重 var validMatrices = dbContext.Matrices .Join(...) .Where(...) .Select(...) .Distinct(); // 写法2添加去重 var validMatrices = dbContext.Matrices .Where(...) .Distinct();
内容的提问来源于stack exchange,提问作者Rob C
相关产品推荐
相关产品推荐

