LINQ Lambda返回父项,其中子项ID在int列表中

ax6ht2ek  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(98)

我有一个矩阵和位置的父/子模式,我想传递一个位置ID int的列表,然后返回连接时的矩阵记录,在SQL中,这返回了我需要的:

select m.* from locationmatrices lm
inner join matrices m on lm.MatrixId = m.Id
where lm.LocationId in (1, 8, 29, 68)

我写了这个LINQ lambda,但它没有像我期望的那样设置连接

var locationIdss = new List<int> { 1, 8, 29, 68 };

matrices.Where(p => p.LocationMatrices.Where(_ => locationIds.Contains(_.Id)).Any());

生成的SQL明显错误:

SELECT [m].[Id], [m].[Archived], [m].[DateCreated], [m].[Description], [m].[Name]
FROM [Stock].[Matrices] AS [m]
WHERE [m].[Archived] = CAST(0 AS bit) AND EXISTS (
SELECT 1
FROM [Stock].[LocationMatrices] AS [l]
WHERE [m].[Id] = [l].[MatrixId] AND [l].[Id] IN (8, 68, 29, 1))

我用查询语法编写了LINQ,它工作得很好:

var foo = from matrixes in _stockContext.Matrices.AsQueryable<Matrix>()
              join location in _stockContext.LocationMatrices.AsQueryable<LocationMatrix>() on matrixes.Id equals location.MatrixId
              where locationIds.Contains(location.LocationId)
              select matrixes;

我只是想知道如何用LINQ Lambda编写它,以保持代码库的一致性(因为它是所有LINQ Lambda)以及我自己的知识。
先谢谢你了
罗伯

sgtfey8w

sgtfey8w1#

如果在上下文中正确设置了关系,则可以尝试:

var lms = _stockContext.LocationMatrices
   .Where(l => locationIds.Contains(l.LocationId))
   .Include(l => l.Matrix) // assuming this exists
   .Where(l => l.Matrix != null)
   .ToList();

var result = lms
   .Select(l => l.Matrix)
   .ToList();

否则,我会争辩说,用方法语法重写查询不会那么漂亮,就我个人而言,我会坚持使用查询语法。

UPD

错过了只需要Matrix数据,所以尝试简化查询:

var lms = _stockContext.LocationMatrices
   .Where(l => locationIds.Contains(l.LocationId))
   .Where(l => l.Matrix != null)
   .Select(l => l.Matrix)
   .ToList();

相关问题