繁体   English   中英

Linq c# - 在加入两个结果集之前如何使用使用 SQL partition over rownumber logic in linq

[英]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子句,因为它看起来是多余的。 如果您仍然希望使用它,您应该使用GroupByOrderBy 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM