2017-02-23 17 views
3

Я пытаюсь группировать свои данные по дням недели, а затем суммировать продажи, как это:LINQ группа по дням, за исключением неделе метания

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

Может быть, есть лучший способ решить эту проблему, я буду ждать ур ответ а =)

+1

вы можете материализовать запрос fiirst - 'StoreItemTransactions.ToList() GroupBy (.... ' –

+1

Какой тип переменной DayOfWeek? – Tinwor

+0

@Tinwor это перечисляемый DayOfWeek – User987

ответ

2

поскольку вы также хотите, чтобы упорядочить результаты по DayOfWeek, используя Dictionary не подходит, и вы должны начать с модели представления, чтобы представлять, что вы хотите с точки зрения

public class SalesVM 
{ 
    public DayOfWeek Day { get; set; } 
    public int Sales { get; set; } 
} 

Для того, чтобы предотвратить исключение, материализовать запрос первого (с помощью ToList() или .AsEnumerable()), и я предлагаю вам просто satrt, выбрав только нужные данные из базы данных

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 к Entities не знает, как чтобы tranlsate, что свойство DateTime в SQL, вам нужно использовать SqlFunctions.DatePart метод для получения DayOfWeek в GroupBy, который может быть сделано следующим образом:.

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