2012-04-13 7 views
3

私のデータベースには、Readsと​​の2つのテーブルがあります。 Reads(1)から​​(多数)の表への1対多の関係があります。さまざまな理由により、​​テーブルの外部キー制約が削除されました。私はこの制約を取り戻すことはできません。したがって、Entity FrameworkモデルのReadオブジェクトには​​ナビゲーションプロパティがありません。ナビゲーションプロパティなしのEntity Frameworkで.Anyと同等の処理が必要

ReadViewModelクラスのブール値プロパティはHasAlarmsです。私はに関連する​​テーブルに少なくとも1つの行がある場合、これをtrueに設定します。私は​​ナビゲーションプロパティがあった場合、私はこのようなものでこれを行うことができることを知っている:

var reads = from read in context.Reads 
      select new ReadViewModel { . . . }; 

foreach (ReadViewModel read in reads) { 
    read.HasAlarms = read.Alarms.Any(); 
} 

しかし、私はこれ以上アラームナビゲーションプロパティを持っていません。私の現在の状況でこれを行う最も効率的な方法は何ですか?

トニー

+0

が鳴りテーブルに参加して、 'Any'を使うことができます。 – Servy

+1

あなたが読み込みとアラームの関係を削除したことが分かったら? – Ivan

答えて

4

あなたはこのようなものが必要です:また、あなたは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; 
+2

これは 'ReadViewModel'ごとにクエリを実行します。 2つのテーブルに参加すると、1つのクエリですべてを実行できます。 – Servy

+0

ありがとう!そうです。 –

関連する問題