[英]Linq c# - before joining two result sets how to use use SQL partition over rownumber logic in linq
我是 LINQ 的新手,我正在尝试将以下 SQL 查询转换为 C# linq 查询:我不确定如何在 LINQ 中使用 SQL 分区。请指导
SELECT A1.RowNo, B1.DetailID, A1.ID
FROM
(
SELECT ROW_NUMBER() OVER(PARTITION BY DetailID ORDER BY A.ID) As RowNo, A.ID , A.DetailID
FROM TableA A
INNER JOIN TableB B
ON A.DetailID = B.ID
) A1
INNER JOIN
(
SELECT ROW_NUMBER() OVER(PARTITION BY OriginalDetailID ORDER BY ID) As RowNo, DetailID AS DetailID
FROM TableC
WHERE ProductName = @productName
) B1
ON A1.DetailID = B1.DetailID AND A1.RowNo = B1.RowNo
由于您的 SQL 与您附加的工作表图像不相关(TableC 和 OriginalDetailID 在哪里?),我可能会错过这里,但您应该使用以下 LINQ 查询获得相同的结果
var query = from a in TableA
join b in TableB on a.DetailID equals b.ID
join c in TableC on a.DetailID equals c.OriginalDetailID
where c.ProductName == productName
select new
{
RowNo = c.ID,
DetailID = c.DetailID,
ID = a.ID
};
请注意,这段代码没有模拟PARTITION BY
子句,因为它看起来是多余的。 如果您仍然希望使用它,您应该使用GroupBy
和OrderBy
LINQ 方法,如本例所示:
var query = from a in TableA
join b in TableB on a.DetailID equals b.ID
join c in TableC on a.DetailID equals c.OriginalDetailID
where c.ProductName == productName
orderby a.ID
group a by a.DetailID into g
select new
{
RowNo = g.OrderBy(x => x.ID).Select((x, i) => new { x, i }).ToDictionary(x => x.x, x => x.i + 1),
DetailID = g.Key,
ID = g.Select(x => x.ID)
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.