38

リポジトリを使用して足場テンプレートから次のメソッドを自動的に生成しました:-

public Group Find(int id)
{
    return context.Groups.Find(id);
}

しかし、Groups オブジェクトには必要な 2 つのナビゲーション プロパティがあるため、 を含めたいので、を:-.Includeに置き換えます。.find.where

public Group Find(int id)
{
    return context.Groups.Where(c=>c.GroupID==id)
                         .Include(a => a.UserGroups)
                         .Include(a2 => a2.SecurityRoles)
                         .SingleOrDefault();
}

.Includeしかし、私の質問は、を使用する.find()代わりに を使用するにはどうすればよい.Where()ですか?

4

3 に答える 3

41

find が実際に何をするのかを考えていました。@lazyberezovsky は正しくinclude と find cant を組み合わせて使用​​できます。これは非常に意図的なものだと思いますが、その理由は次のとおりです。

DbSet の Find メソッドは、主キーの値を使用して、コンテキストによって追跡されるエンティティを見つけようとします。コンテキスト内でエンティティが見つからない場合は、クエリがデータベースに送信され、そこでエンティティが検索されます。コンテキストまたはデータベースでエンティティが見つからない場合は、null が返されます。

検索は、次の 2 つの重要な点でクエリの使用とは異なります。

  • データベースへのラウンドトリップは、指定されたキーを持つエンティティがコンテキストで見つからない場合にのみ行われます。
  • Find は、Added 状態のエンティティを返します。つまり、Find は、コンテキストに追加されたがまだデータベースに保存されていないエンティティを返します。

( http://msdn.microsoft.com/en-us/data/jj573936.aspxから)

find は最適化された方法であるため、サーバーにアクセスする必要がなくなります。これは、エンティティが既に追跡されている場合に最適です。EF はそれをより速く返すことができるからです。

ただし、対象がこのエンティティだけではない場合 (たとえば、追加のデータを含めたい場合)、このデータがサーバーから既に読み込まれているかどうかを知る方法はありません。EF はおそらく結合と組み合わせてこの最適化を行うことができますが、データベースの状態について想定しているため、エラーが発生しやすくなります。

include と find を一緒に使用できないのは、データの整合性と不必要な複雑さを確保するための非常に慎重な決定だと思います。結合を実行するために常にデータベースに移動する場合は、はるかにクリーンでシンプルです。

于 2013-07-10T22:22:42.580 に答える
7

できません。タイプで定義されたメソッドを検索DbSet<T>し、エンティティを返します。Includeエンティティを呼び出すことはできないため、可能な唯一のオプションはFind after Includeを呼び出すことです。DbSet<T>そのためには typeが必要ですが、Include("UserGroups")を返しDbQuery<T>Include(g => g.UserGroups)また も返しDbQuery<T>ます:

public static IQueryable<T> Include<T>(this IQueryable<T> source, string path) 
    where T: class
{
    RuntimeFailureMethods.Requires(source != null, null, "source != null");
    DbQuery<T> query = source as DbQuery<T>;
    if (query != null)    
        return query.Include(path); // your case
    // ...
}

DbQuery<T>の子ではないDbSet<T>ため、メソッドFindは使用できません。また、Find最初にローカル オブジェクト内のエンティティを検索することにも注意してください。まだロードされていない場合、参照されたエンティティをどのように含めますか?

于 2013-07-10T17:01:50.337 に答える