我试图按星期几对数据进行分组,然后按照以下方式对销售额进行总结:
ViewBag.DailyGraph = ctx.StoreItemTransactions
.GroupBy(x => x.TransactionDate.Value.DayOfWeek)
.Select(pr => new { Day = pr.Key,
Sales = pr.Sum(x => x.QuantitySoldTransaction)
})
.ToDictionary(y => y.Day, y => y.Sales);
但是我得到了这个例外:
指定的类型成员' DayOfWeek' LINQ to Entities不支持。仅支持初始化程序,实体成员和实体导航属性。
我该如何解决这个问题?我基本上试图将我的所有数据分组,每周7天,以便输出为:
Monday 1
Tuesday 5
...
Sunday 14
有人可以帮我解决这个问题吗?
@StephenMuecke,通过应用你告诉我的内容,我能够完成代码并对所有日子进行排序:
var DailyGraph = ctx.StoreItemTransactions.ToList()
.GroupBy(x => x.TransactionDate.Value.DayOfWeek)
.Select(pr => new HourlyGraph
{ Day = pr.Key.ToString(),
Sales = pr.Sum(x => x.QuantitySoldTransaction)
});
var dayIndex = new List<string> { "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY" };
ViewBag.DailyGraph = DailyGraph.OrderBy(e => dayIndex.IndexOf(e.Day.ToUpper())).ToList();
也许有更好的解决方法,我也会等你回答=)
答案 0 :(得分:2)
由于您还想按DayOfWeek
订购结果,因此使用Dictionary
是不合适的,您应该从视图模型开始,以在视图中表示您想要的内容
public class SalesVM
{
public DayOfWeek Day { get; set; }
public int Sales { get; set; }
}
为了防止异常,首先实现您的查询(使用ToList()
或.AsEnumerable()
),我建议您只需从数据库中选择所需的数据
ViewBag.DailyGraph = ctx.StoreItemTransactions
.Select(x => new { Date = x.Date, Sales = x.Sales }) // select only required data
.ToList() // materialize
.GroupBy(x => x.Date.DayOfWeek) // group by day of week
.Select(x => new TestVM() { Day = x.Key, Sales = x.Sum(y => y.Sales) }) // project to view model
.OrderBy(x => (int)x.Day); // order by day of week
答案 1 :(得分:2)
Linq to Entities不知道如何将DateTime的属性转换为sql,你需要使用SqlFunctions.DatePart方法获取groupby中的dayofweek,这可以通过以下方式完成:
var result = ctx.StoreItemTransactions
.GroupBy(x => SqlFunctions.DatePart("weekday", x.TransactionDate))
.Select(pr => new HourlyGraph
{
Day = pr.Key.ToString(),
Sales = pr.Sum(x => x.QuantitySoldTransaction)
});