尝试使用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
下面的代码将按天分组,就像我想要的那样,但我不知道如何结合Type
和Date
分组:
_entityContext.Statistics.
.GroupBy(s => new { s.DateTime.Year, s.DateTime.Month, s.DateTime.Day})
我一直在挣扎,现在我结束了复杂的igrouing结构,我现在有点卡住了。谷歌引导我走向查询语法结构,但我真的想知道这是否可能使用方法语法。最后我知道查询语法翻译成方法语法,所以它应该是可能的?
谁能给我指路?注意:LINQ TO Entities不支持在DateTime上访问'Date'属性。你将得到的异常是:"在LINQ to Entities中不支持指定的类型成员'Date'。"
将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)};