Необходимо сделать эквивалент. Любой в Entity Framework без свойства навигации

В моей базе данных две таблицы, Reads и Alarms. Между отношением Reads (1) и Alarms (многие) существует отношение от одного до многих. По разным причинам ограничение внешнего ключа в таблице Alarms было удалено. Я не могу восстановить это ограничение. Объект Read в моей модели Entity Framework, следовательно, не имеет свойства навигации Alarms.

У меня есть логическое свойство в моем классе ReadViewModel под названием HasAlarms. Я хочу, чтобы это было установлено на true, если в таблице Alarms есть хотя бы одна строка, связанная с Read. Я знаю, что если бы существовало свойство навигации Alarms, я мог бы сделать это примерно так:

var reads = from read in context.Reads
 select new ReadViewModel { . . . };
foreach ( ReadViewModel read in reads ) {
 read.HasAlarms = read.Alarms.Any();
}

Однако у меня больше нет свойства навигации Alarms. Каков наиболее эффективный способ сделать это в моей нынешней ситуации?

Тони

1 ответ

Вам понадобится что-то вроде этого:

foreach ( ReadViewModel read in reads ) {
 read.HasAlarms = context.Alarms.Any(a => a.ReadId == read.Id);
}

Также вы можете выполнить объединение, чтобы получить состояние в одном запросе:

var results = from r in reads
join a in context.Alarms on r.Id equals a.ReadId into ra // perform a left join
from a in ra.DefaultIfEmpty() // on Alarms
select new { Read = r, HasAlarm = a != null };
foreach (var res in results)
 res.Read.HasAlarm = res.HasAlarm;

licensed under cc by-sa 3.0 with attribution.