2

エンティティと、それに関連するエンティティの1つを返すクエリを作成したいと思います。例えば:

select *, (select COUNT(*) from Forms where Contact_Id = Contacts.Id) 
as FormsCount from Contacts;

私のContactエンティティにはFormsCountという名前のプロパティがありますが、テーブルにそのような名前の列がないため、マップされていません。追加のFormsCountプロパティが入力されたContactエンティティを返すLINQクエリを1つ作成することは可能ですか?

または、FormsCount値を別のフィールドで取得して、それらをエンティティに手動でコピーできれば幸いです。クエリの結果は、次のような形式になります。

{
  Contact Contact;
  int FormsCount;
}

次に、結果を繰り返し処理して、FormsCountをContactにコピーできます。多分これは投影を使用することによって達成することができますか?

私は2つのクエリを使用してそれを行う方法を知っています:a)最初に連絡先エンティティをフェッチしますb)最初のクエリで返された連絡先のペアまたは連絡先IDとFormsCountをフェッチします。

しかし、私は1つのクエリを使用してそれを実行したいと思います。また、FormsCountプロパティが常にContactエンティティに入力されることは望ましくありません。これを制御したいのですが、何か案は?

ありがとう、ミハル

4

1 に答える 1

6

あなたは投影について正しいです。

Contactナビゲーションプロパティがある場合は、次のようにForms投影できます。

from c in context.Contacts
select new { Contact = c, FormsCount = c.Forms.Count() }

そうでない場合は、サブクエリを使用する必要があります。

from c in context.Contacts
select new
{
  Contact = c, 
  FormsCount = context.Forms.Count(f => f.Contact_Id == c.Id)
}

EFは、1つのSQLクエリで両方の状況を処理します。

于 2012-11-25T21:15:55.653 に答える