簡體   English   中英

將分區上的 row_number 轉換為 C# linq

[英]translate row_number over partition to C# linq

如何將以下 SQL 查詢轉換為 C# Linq:

SELECT * FROM (
   SELECT *, ROW_NUMBER() OVER (PARTITION BY StuffConditionId, StuffId ORDER BY StuffDayOfYear) AS RowNumber
   FROM Stuff) rop
WHERE rop.RowNumber = 1;

這是一個部分數據集:

StuffId,StuffValue,StuffConditionId,StuffDayOfYear
2,9340,NULL,1
2,9340,NULL,2
2,9340,NULL,3
11,78,NULL,267
11,78,NULL,268
11,78,NULL,269
43,0,3,130
43,0,3,131
43,0,3,132
43,0,2,133
45,0,2,134
45,0,2,135
45,0,2,148
55,0,2,309
55,0,2,332
55,0,3,333

答案摘要:答案是首先構建一個內存中的東西列表,即本地列表變量,然后應用 LINQ 查詢,如下面的答案所示。

沒有一些實際數據,我無法對此進行測試。 但這里是如何做到這一點,假設stuff是你的收藏(又名表):

var firstInCollection = Stuff
    .OrderBy(x => x.StuffDayOfYear)
    .ToList() // Load in memory, then do groupby and select first due to EF Core
    .GroupBy(x => new { condition = x.StuffConditionId, stuff = x.StuffId })
    .Select(g => g.First());

好的,我已經在包含國家/地區列表的數據表上進行了嘗試。 這是我的結果:

SELECT *
FROM (
   SELECT *, ROW_NUMBER() OVER (PARTITION BY SUBSTRING(CountryCode, 1, 1) ORDER BY CountryCode) AS RowNumber
   FROM Lookup.Country) rop
WHERE rop.RowNumber = 1;

並在 SQL 中得到以下結果

在此處輸入圖片說明

然后我使用了以下 Linq 語句。 這是在連接到我的 Microsoft SQL 數據庫的 LinqPad 中使用 Linq2SQL:

Countries
    .OrderBy(c => c.CountryName)
    .GroupBy(c => c.CountryName[0])
    .Select(g => g.First())

並得到以下結果:

在此處輸入圖片說明

這與 SQL 結果相關。

這是您的示例數據的示例

void Main()
{
    var stuffs = new []
    {
        new Stuff { StuffId =  2, StuffValue = 9340, StuffConditionId = null, StuffDayOfYear = 1   },
        new Stuff { StuffId =  2, StuffValue = 9340, StuffConditionId = null, StuffDayOfYear = 2   },
        new Stuff { StuffId =  2, StuffValue = 9340, StuffConditionId = null, StuffDayOfYear = 3   },
        new Stuff { StuffId = 11, StuffValue =   78, StuffConditionId = null, StuffDayOfYear = 267 },
        new Stuff { StuffId = 11, StuffValue =   78, StuffConditionId = null, StuffDayOfYear = 268 },
        new Stuff { StuffId = 11, StuffValue =   78, StuffConditionId = null, StuffDayOfYear = 269 },
        new Stuff { StuffId = 43, StuffValue =    0, StuffConditionId =    3, StuffDayOfYear = 130 },
        new Stuff { StuffId = 43, StuffValue =    0, StuffConditionId =    3, StuffDayOfYear = 131 },
        new Stuff { StuffId = 43, StuffValue =    0, StuffConditionId =    3, StuffDayOfYear = 132 },
        new Stuff { StuffId = 43, StuffValue =    0, StuffConditionId =    2, StuffDayOfYear = 133 },
        new Stuff { StuffId = 45, StuffValue =    0, StuffConditionId =    2, StuffDayOfYear = 134 },
        new Stuff { StuffId = 45, StuffValue =    0, StuffConditionId =    2, StuffDayOfYear = 135 },
        new Stuff { StuffId = 45, StuffValue =    0, StuffConditionId =    2, StuffDayOfYear = 148 },
        new Stuff { StuffId = 55, StuffValue =    0, StuffConditionId =    2, StuffDayOfYear = 309 },
        new Stuff { StuffId = 55, StuffValue =    0, StuffConditionId =    2, StuffDayOfYear = 332 },
        new Stuff { StuffId = 55, StuffValue =    0, StuffConditionId =    3, StuffDayOfYear = 333 }
    };


    var firstInCollection = stuffs
        .OrderBy(x => x.StuffDayOfYear)
        .GroupBy(x => new { condition = x.StuffConditionId, stuff = x.StuffId })
        .Select(g => g.First())
        .Dump();
}

class Stuff
{
    public int StuffId { get; set; }
    public int StuffValue { get; set; }
    public int? StuffConditionId { get; set; }
    public int StuffDayOfYear { get; set; }
}

這導致以下結果:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM