简体   繁体   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

I am very new to LINQ and I am trying to convert the below SQL query to C# linq query: I am not sure how to use SQL partition by in LINQ. Please guide我是 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

在此处输入图像描述

As your SQL doesn't correlate with the sheet image you attached (where are TableC and OriginalDetailID?), I might miss here but you should achieve the same result with the below LINQ query由于您的 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
        };

Note that this code does not simulate the PARTITION BY clause as it seems redundant.请注意,这段代码没有模拟PARTITION BY子句,因为它看起来是多余的。 If you wish to still use it, you should utilize the GroupBy and OrderBy LINQ methods like in this example:如果您仍然希望使用它,您应该使用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