2012-04-13 2 views
3

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

У меня есть свойство boolean в моем классе 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(); 
} 

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

Tony

+0

звучит, как вы будете вручную необходимо чтобы присоединиться к таблицам, а затем вы можете использовать свой «Любой». – Servy

+1

Если я понимаю, что вы удалили связь между чтениями и тревогами? – Ivan

ответ

4

Вам нужно что-то вроде этого:

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; 
+2

это сделает запрос для каждого 'ReadViewModel'. Если вы присоединитесь к двум таблицам, вы можете сделать все это в одном запросе ... – Servy

+0

Спасибо! Это и есть. –

Смежные вопросы