#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. Спасибо, пока это работает.