簡體   English   中英

Linq按多個列與匿名列分組

[英]Linq group by multiple columns with anonymous column

我不知道如何正確表達問題,但是我有:

            var groups = data.GroupBy(x => new {x.EntityId, x.StartLocal = new {
                var stamp = x.StartLocal;
                stamp = stamp.AddHours(-(stamp.Hour % hours));
                stamp = stamp.AddMinutes(-stamp.Minute);
                stamp = stamp.AddMilliseconds(-stamp.Millisecond);
                return stamp;
            }})
.Select(...)
            .ToList();

這不起作用(語法錯誤)。 我首先entityId然后按一個名為StartLocal的字段的小時分組,就像如果我將結果每隔2小時分組一次,我將得到:

Id = 1
     Hour = 2
     Hour = 4
Id = 2
     Hour = 2
...

像這樣

我需要填寫的是:

        DO obj = new DO
        {
            EntityId = pp.EntityId,
            EntityCode = pp.EntityCode,
            StartLocal = pp.StartLocal,
            Volume = pp.Volume,
        };

Volume是需要匯總的內容。 因此,基本上這些DO的1000個以數組的形式出現,然后按EntityId進行拆分,然后按StartLocal的小時數進行拆分...將數量匯總為x的小時數量,並創建了相同的DO ...但現在少一些。

似乎您想要這樣的東西:

var groups = data.GroupBy(x => 
    {
        var stamp = x.StartLocal;
        stamp = stamp.AddHours(-(stamp.Hour % hours));
        stamp = stamp.AddMinutes(-stamp.Minute);
        stamp = stamp.AddMilliseconds(-stamp.Millisecond);
        return new { x.EntityId, StartLocal = stamp };
    });

或更簡單地說:

var groups = data.GroupBy(x => new 
    { 
        x.EntityId, 
        StartLocal = new DateTime(
            x.StartLocal.Year, 
            x.StartLocal.Month, 
            x.StartLocal.Day, 
            x.StartLocal.Hour % hours, 0, 0)
    });

這些都使StartLocal向下舍入到一個小時。 如果您只需要一個小時,則可以執行以下操作:

var groups = data.GroupBy(x => new { x.EntityId, x.StartLocal.Hour % hours });

您應該解釋為什么要嘗試更高級別的操作。 可能還有其他(更好)的方法來完成您要嘗試的操作。

從您正在做的事情來看,在我看來,您只是想按項目的ID,開始日期和時間對項目進行分組。 您無需嘗試創建單個DateTime對象來表示日期和小時,只需單獨獲取組件即可。 此外,您的查詢提供程序可能不支持復雜的選擇器,這看起來不像對象查詢的LINQ。

只要這樣做:

var groups = data.GroupBy(x => new
    {
        x.EntityId,
        StartDate = x.StartLocal.Date,
        StartHour = x.StartLocal.Hour,
    })
    .Select(...)
    .ToList();

您真正需要的是對GroupBy調用,而不是對復雜對象的單個調用分組。

var query = data.GroupBy(item => item.EntityId)
    .Select(group => group.GroupBy(item => item.StartLocal));

這將為您提供深度為3的樹,而不是兩個或換句話說,成組的樹。

暫無
暫無

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

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