【问题标题】:LINQ group by day of the week throwing exceptionLINQ 按星期几分组抛出异常
【发布时间】:2017-07-13 14:07:06
【问题描述】:

我正在尝试按星期几对我的数据进行分组,然后像这样对销售额求和:

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

但我遇到了这个异常:

LINQ to Entities 不支持指定的类型成员“DayOfWeek”。仅支持初始化器、实体成员和实体导航属性。

我该如何解决这个问题?我基本上试图将我的所有数据按每周 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();

也许有更好的方法来解决这个问题,我也会等你的回答=)

【问题讨论】:

  • 您可以先实现查询 - StoreItemTransactions.ToList().GroupBy(....
  • DayOfWeek 是哪种类型的变量?
  • @Tinwor 它是可枚举的 DayOfWeek
  • @StephenMuecke thx 是的,它就像一个魅力。快速提问伙伴,现在对所有天进行排序的最佳方法是什么,因为它们是字符串形式的,我想我不能只说:.OrderBy(x=>x.Day) => 这个“应该” t" 做任何事情,因为这是字符串? =D
  • 它是一个enum,因此您可以将其转换为int(例如(int)Day),但是您使用的是字典,因此排序实际上没有意义-您可能需要一个视图模型属性DayOfWeek Dayint Sales 并将查询投影到该模型的集合中

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


【解决方案1】:

由于您还想按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

【讨论】:

    【解决方案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) 
                           });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-10
      • 2011-10-31
      • 1970-01-01
      • 2021-10-29
      • 2017-08-06
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      相关资源
      最近更新 更多