2017-05-23 11 views
0

ASP.NET MVC & Entity Frameworkアプリケーションを作成しています。ASP.NET MVC Entity Frameworkの選択カウントインナー別のテーブルへの結合

私は0対多数の関係を持つ2つのテーブルを持っています。私は最初のテーブルからselectを実行しなければならず、また別のフィルタを使って2番目のテーブルのcount()を取得する必要があります。

Ansi SQLではこれは多かれ少なかれこれに似ています。

select 
    *, 
    convert(varchar(3), (select count(User_id) 
         from ActivityGroups G with(nolock) 
         where A.Activity_id = G.Activity_id 
          and G.ProcessState_id = 1)) + ' (' + 
    convert(varchar(3), (select count(User_id) 
         from ActivityGroups G with(nolock) 
         where A.Activity_id = G.Activity_id 
          and G.ProcessState_id = 2)) + ')' as Members 
from 
    Activities A 

これは、名前members5(3)のような文字列を取得します。

LINQクエリこれまで:

IEnumerable<ActivitySearch> viewModel = (from activities in _db.Activities 
         .Where(p => p.ProcessState_id == Security.APPROVED) 
         .OrderByDescending(p => p.CreationDate) 
         select new ActivitySearch 
         { 
          Activity_Id = activities.Activity_Id, 
          User_id = activities.User_id, 
          Type = activities.Type, 
          SeekName = activities.SeekName, 
         }); 

私はどのように戻り値に別のテーブルにCount()を追加しないでください。

ありがとうございました

+0

私は* with(nolock)はAnsi SQLと考えられます...... –

答えて

2

クエリでは「let」キーワードを使用できます。

var viewModel = from activities in _db.Activities 
 
         let ag1 = activities.ActivityGroups.Where(i => i.ProcessState_Id == 1).Count() 
 
         where p.ProcessState_id == Security.APPROVED 
 
         order by p.CreationDate descening 
 
         select new ActivitySearch 
 
         { 
 
          Activity_Id = activities.Activity_Id, 
 
          User_id = activities.User_id, 
 
          Type = activities.Type, 
 
          SeekName = activities.SeekName, 
 
          Group1Count = ag 
 
         };

基本的にletキーワードは、上記のあなたの例のようにサブクエリを発行します。注意しないとパフォーマンスの問題が発生する可能性があるので、クエリをどのように作成するか注意してください。

+0

あなたはそこにタイプミスがあります( 'ag1' - ' ag')。また、私は、 'let'を使うと、EFが他のナビゲーションプロパティの内部結合の代わりに外部結合を使用することがよくあることを経験しました。ここには他のナビゲーションプロパティはありませんが、繰り返しコードを減らす場合にのみ 'let'を使用します。 'Group1Count = activities.ActivityGroups .....'と書くこともできます。 –

+0

それはうまくいくか、 'let = _db.ActivityGroups.Where(i => i.ActivityID == activities.Activity_Id && i.ProcessState_Id == 1);'のようになります。私はナビゲーションプロパティでletを使って問題を抱えていませんでした - 私は外部結合の問題は経験していませんが、特定の種類の文がそれを引き起こす可能性があります。 –

関連する問題