【问题标题】:The specified type member 'DayOfWeek' is not supported in LINQLINQ 不支持指定的类型成员“DayOfWeek”
【发布时间】:2017-12-23 20:36:53
【问题描述】:

我已经尝试使用this SO question 中的选项。我仍然收到以下错误:

The specified type member 'DayOfWeek' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

现在已编辑问题以包含我要实现的目标的完整代码。它基本上需要拉取一周中每天发送的平均短信数。

这是我的代码:

var weekDays = rad.SMSSentItems
    .Where(x => x.Status == "DELIVRD")
    .GroupBy(x => x.StatusDate.Value.DayOfWeek)
    .Select(g => new
    {
        DayOfWeek = g.Key,
        Count = g.Count()
    })
    .ToList();


int avgSMSPerMonday = 0;
int avgSMSPerTuesday = 0;
int avgSMSPerWednesday = 0;
int avgSMSPerThursday = 0;
int avgSMSPerFriday = 0;
int avgSMSPerSaturday = 0;
int avgSMSPerSunday = 0;
int totalSMSPerDay = 0;

foreach (var day in weekDays)
{
    totalSMSPerDay = rad.SMSSentItems.Where(x => (DbFunctions.TruncateTime(x.StatusDate).Value.DayOfWeek == day.DayOfWeek) && (x.Status == "DELIVRD")).ToList().Count;

    if (day.DayOfWeek == DayOfWeek.Monday)
        avgSMSPerMonday = totalSMSPerDay / day.Count;
    else if (day.DayOfWeek == DayOfWeek.Tuesday)
        avgSMSPerTuesday = totalSMSPerDay / day.Count;
    else if (day.DayOfWeek == DayOfWeek.Wednesday)
        avgSMSPerWednesday = totalSMSPerDay / day.Count;
    else if (day.DayOfWeek == DayOfWeek.Thursday)
        avgSMSPerThursday = totalSMSPerDay / day.Count;
    else if (day.DayOfWeek == DayOfWeek.Friday)
        avgSMSPerFriday = totalSMSPerDay / day.Count;
    else if (day.DayOfWeek == DayOfWeek.Saturday)
        avgSMSPerSaturday = totalSMSPerDay / day.Count;
    else if (day.DayOfWeek == DayOfWeek.Sunday)
        avgSMSPerSunday = totalSMSPerDay / day.Count;
}

使用 Camillo 的代码更新代码:

var weekDays = rad.SMSSentItems
                            .Where(x => x.Status == "DELIVRD")
                            .GroupBy(x => x.StatusDate.Value.DayOfWeek)
                            .Select(g => new
                            {
                                DayOfWeek = g.Key,
                                Count = g.Count()
                            })
                            .ToDictionary(x => x.DayOfWeek, x => x.Count);

                int mondayCount = 0;
                int tuesdayCount = 0;
                int wednessdayCount = 0;
                int thursdayCount = 0;
                int fridayCount = 0;
                int saturdayCount = 0;
                int sundayCount = 0;

                //determine average number of sms's sent per day of week
                foreach (var day in weekDays)
                {
                    int daysCount = rad.SMSSentItems
                        .Where(x => (x.StatusDate.Value.DayOfWeek == day.Key)
                                 && x.Status == "DELIVRD")
                        .Count();

                    if (day.Key == DayOfWeek.Monday)
                        mondayCount = daysCount / day.Value;
                    else if (day.Key == DayOfWeek.Tuesday)
                        tuesdayCount = daysCount / day.Value;
                    else if (day.Key == DayOfWeek.Wednesday)
                        wednessdayCount = daysCount / day.Value;
                    else if (day.Key == DayOfWeek.Thursday)
                        thursdayCount = daysCount / day.Value;
                    else if (day.Key == DayOfWeek.Friday)
                        fridayCount = daysCount / day.Value;
                    else if (day.Key == DayOfWeek.Saturday)
                        saturdayCount = daysCount / day.Value;
                    else if (day.Key == DayOfWeek.Sunday)
                        sundayCount = daysCount / day.Value;
                }

我仍然留下从第一个查询中得到的初始错误,如下所示:

The specified type member 'DayOfWeek' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported

【问题讨论】:

  • 指的是循环中的当前项。
  • 你真的不应该在发布答案后彻底改变问题。这就是为什么您应该首先提供所有相关信息的原因。请阅读How to Ask 并采取tour
  • 我很抱歉@Plutonix

标签: c# entity-framework linq


【解决方案1】:

您不需要做所有这些检查,您可以使用 Dictionary<DayOfWeek, int> 代替:

var weekDays = rad.SMSSentItems
    .Where(x => x.Status == "DELIVRD")
    .GroupBy(x => x.StatusDate.Value.DayOfWeek)
    .Select(g => new
    {
        DayOfWeek = g.Key,
        Count = g.Count()
    })
    .ToDictionary(x => x.DayOfWeek);

int mondayCount = weekDays[DayOfWeek.Monday];
int tuesdayCount = weekDays[DayOfWeek.Tuesday];
//...

如果您不确定某一天是否有值,请改用TryGetValue

weekDays.TryGetValue(DayOfWeek.Monday, out mondayCount);

如果你想要一周中某一天的平均值,你可以使用这样的东西:

foreach (var day in weekDays)
{
    int daysCount = rad.SMSSentItems
        .Where(x => x.StatusDate.Value.DayOfWeek == day.DayOfWeek
                 && x.Status == "DELIVRD")
        .Count();

    int dayAverage = day.Count / daysCount;
}

【讨论】:

  • 这将产生一周中某一天发送的短信总数?如何修改它以产生一周中每天的平均短信数?
  • 那么,EF 能够 GroupBy DayOfWeek 没有任何问题吗?我认为这是问题的本质
  • ToDictionary() 出现错误;它说方法'ToDictionary'没有重载需要0个参数。
  • @Orion 我已经解决了这个问题,它错过了键选择器。不清楚你所说的平均数是什么意思
  • @CamiloTerevinto 您关注的是错误的问题(尽管值得解决)。你应该使用SqlFunctions.DatePart("dw", x.StatusDate))
猜你喜欢
  • 1970-01-01
  • 2015-01-27
  • 2012-07-17
  • 2012-03-03
  • 1970-01-01
  • 2013-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多