Как включить нулевые вхождения в результирующий набор группы по предложению EF Core

#c# #entity-framework #.net-core #entity-framework-core

#c# #сущность-фреймворк #.net-core #сущность-структура-ядро

Вопрос:

В таблице есть журналы событий, я хочу узнать количество каждого типа событий, учитывая типы в предложении where. Проблема в том, что если я передаю типы событий в предложении where, я получаю обратно только события, соответствующие условию, я хочу вернуть 0 для событий, которые не совпадают. Например:

      var data = await (from eventLogs in _context.Set<EventLog>()
                          where (eventTypes.Contains(eventLogs.EventType))
                          group eventLogs by eventLogs.EventType
                          into log
                          select new
                          {
                              EventType = log.Key,
                              Occurrences = log.Count()
                          })
                         .ToDictionaryAsync(x => x.EventType, x => x.Occurrences);
 

Результаты

Тип события Заголовок 2
12 34
52 3

Желаемый результат

Тип события Заголовок 2
12 34
52 3
71 0

Комментарии:

1. Я полагаю eventTypes , содержит три интересующих вас типа событий?

2. @DStanley, да. Я хочу, чтобы результат включал все типы событий, которые были переданы в условии «Where».

Ответ №1:

Я предполагаю, что в eventlogs нет записей с typeId =71. Таким образом, вы можете создать объединение

 
 var data1 = await (from eventLogs in _context.Set<EventLog>()
                          where (eventTypes.Contains(eventLogs.EventType))
                          group eventLogs by eventLogs.EventType
                          into log
                          select new
                          {
                              EventType = log.Key,
                              Occurrences = log.Count()
                          })
                         .ToListAsync();

var data2 = eventTypes.Select(i=> new
{
     EventType = i,
    Occurrences = 0
}).ToList();

var data = data1.Union(data2).GroupBy(o => new {o.EventType})
                .Select(o => new 
                {
                    EventType = o.Key.EventType ,
                    Occurrences = o.Sum(q => q.Occurrences )
                }).ToDictionary(x => x.EventType, x => x.Occurrences);

 

Комментарии:

1. Я надеялся, что будет какая-то магия ядра EF для форматирования данных на стороне SQL, но я думаю, нам нужно добавить / объединить не совпадающие элементы в памяти после извлечения данных с SQL Server. Спасибо, пока это работает.