0

MVC4アプリには次のものがあります。両方のキーで負荷をフィルタリングしたいのですが、多対多の可能性がありますが、両方のキーが一緒になって一意の行を表します。必要な場合にのみこれらのコレクションを明示的にロードし、関係の両側でフィルタリングするという目標。

次のEntity.DBContextがあります。これは機能しますが、UserIdキーに対してのみ機能します。

context.UserProfiles.Include(o => o.CoachOfOrginizations).Where(p => p.UserId == UserId).Single()

また、これはそれらすべてをロードしますが、もちろんまったくフィルタリングせず、流暢なコードを適切に設定したことを示しているだけです。

    context.Entry(this).Collection(t => t.AdministratorOfOrginizations).Load();

modelBuilder.Entity<UserProfile>()
                .HasMany(p => p.CoachOfOrginizations)
                .WithMany(t => t.Coaches)
                .Map(mc =>
                {
                    mc.ToTable("OrganizationCoaches");
                    mc.MapLeftKey("UserProfileID");
                    mc.MapRightKey("OrganizationID");
                });

CoachOfOrginizationsは、UserProfileの次のプロパティです。

public ICollection<Organization> CoachOfOrginizations { get; set; }

私が欲しいのは、Organization.ID(他のキー)と現在使用されているキーp.UserIdに基づいて、元の.Includeをフィルタリングすることです。私は次のことを試しましたが、うまくいきません、何かアドバイスはありますか?「this」はUserProfileオブジェクトです。

context.Entry(this)
                .Collection(b => b.CoachOfOrginizations)
                .Query()
                .Where(p => p.ID == orgID)
                .Load();
4

1 に答える 1

1

1つのクエリで両方のフィルタリングを実行できます。条件付きインクルードを参照してください。

var query = context.UserProfiles
             .Where(p => p.UserId == UserId)
             .Select(p => new { p, Orgs = p.CoachOfOrginizations.Where(o => o.ID == orgID) });

var profiles = query.AsEnumerable().Select(a => a.p);
于 2012-09-22T01:36:03.413 に答える