我有一个矩阵和位置的父/子模式,我想传递一个位置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)以及我自己的知识。
先谢谢你了
罗伯
1条答案
按热度按时间sgtfey8w1#
如果在上下文中正确设置了关系,则可以尝试:
否则,我会争辩说,用方法语法重写查询不会那么漂亮,就我个人而言,我会坚持使用查询语法。
UPD
错过了只需要
Matrix
数据,所以尝试简化查询: