LINQ组每周都会抛出异常

时间:2017-02-23 07:49:13

标签: c# asp.net asp.net-mvc linq group-by

我试图按星期几对数据进行分组,然后按照以下方式对销售额进行总结:

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();

也许有更好的解决方法,我也会等你回答=)

2 个答案:

答案 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) 
                       });