[英]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.