以前は、多対多の関係や POCO のリレーショナル Id などのすべてのヘルパー テーブルを自分で生成していましUsergroupUsersたが、今では EF にそれらを処理してもらいたいと考えています。結局のところ、それはそれほど良い考えではないと思います。
問題
UsergroupDynamicField特定のユーザーのすべてを取得しようとするとN+1、ユーザーが属するすべてのユーザーグループに対してクエリが生成されます。
ここでは、の代わりにUsergroupsが になると単純に述べるだけで、この問題を克服しました。EFはそれをマップしないため、今はそれを行うことができません。IQUeriableIEnumerableICollection
コード
public class User
{
...
public virtual ICollection<Usergroup> Usergroups { get; set; }
public IEnumerable<UserField> Fields
{
get
{
var fields = this.Usergroups.SelectMany(x => x.UsergroupDynamicFields); // N + 1 for every Usergroup
foreach (var field in fields)
{
yield return new UserField
{
Name = field.Name
};
}
}
}
}
データベース
