簡體   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