尝试使用LINQ方法语法将GroupBy与多个属性一起使用时出现问题

本文关键字:一起 属性 问题 GroupBy LINQ 方法 语法 | 更新日期: 2023-09-27 18:16:13

我得到了以下数据:

Type (enum)   Date (DateTime)       Count (int)
Red           2014-07-27 11:00:00   1
Red           2014-07-27 10:00:00   1
Red           2014-07-27 09:00:00   1
Blue          2014-07-27 11:00:00   1
Blue          2014-07-27 10:00:00   1
Blue          2014-07-27 09:00:00   1

我想首先按Type分组,然后对每天的Count求和。

我想要的输出是:

Type (enum)   Date (DateTime)       Count (int)
Red           2014-07-27            3
Blue          2014-07-27            3

下面的代码将按天分组,就像我想要的那样,但我不知道如何结合TypeDate分组:

_entityContext.Statistics.
.GroupBy(s => new { s.DateTime.Year, s.DateTime.Month, s.DateTime.Day})

我一直在挣扎,现在我结束了复杂的igrouing结构,我现在有点卡住了。谷歌引导我走向查询语法结构,但我真的想知道这是否可能使用方法语法。最后我知道查询语法翻译成方法语法,所以它应该是可能的?

谁能给我指路?

注意:LINQ TO Entities不支持在DateTime上访问'Date'属性。你将得到的异常是:"在LINQ to Entities中不支持指定的类型成员'Date'。"

尝试使用LINQ方法语法将GroupBy与多个属性一起使用时出现问题

"

Type添加到您的GroupBy:

_entityContext.Statistics.GroupBy(
    // Define the key for the GroupBy to be Type and the Day
    s => new { s.Type, s.Date.Year, s.Date.Month, s.Date.Day},
    // Reduce each group to just the key and the sum of its Count values
    (key, ss) => new { key, count = ss.Sum(s => s.Count) }
);

测试使用LINQ-to-Entities

为了避免错误,我添加了ToList

_entityContext.Statistics
.ToList()
.GroupBy(s => new 
{
    s.Type, 
    Date = s.Date.Date
})
.Select(s=>new
{
    Type=s.Key.Type, 
    Date = s.Key.Date, 
    Count = s.Count()
});

我发现EF有这些正则函数。有一个名为TruncateTime的方法,我相信它没有经过测试,可以做到这一点:

_entityContext.Statistics
.ToList()
.GroupBy(s => new 
{
    s.Type, 
    Date = TruncateTime(s.Date)
})
.Select(s=>new
{
    Type=s.Key.Type, 
    Date = s.Key.Date, 
    Count = s.Count()
});

由于有些人更喜欢查询样式,这里有一个替代:

var query = from elem in _entityContext.Statistics
            group elem by new{ Type = elem.Type, Date = elem.Date.Date} into grp
            select new {Type = grp.Key.Type, Date = grp.Key.Date, Count = grp.Sum(e=>e.Count)};

要解决LINQ-to-Entity问题,我认为你只需要从一个可枚举或列表或数组中查询,例如尝试:

var query = from elem in _entityContext.Statistics.ToArray()
                group elem by new{ Type = elem.Type, Date = elem.Date.Date} into grp
                select new {Type = grp.Key.Type, Date = grp.Key.Date, Count = grp.Sum(e=>e.Count)};