次の方法で共有


エンティティのクエリと検索

このトピックでは、LINQ や Find メソッドなど、Entity Framework を使用してデータを照会するさまざまな方法について説明します。 このトピックで示す手法は、Code First と EF Designer で作成されたモデルにも同様に適用されます。

クエリを使用したエンティティの検索

DbSet と IDbSet は IQueryable を実装しているため、データベースに対する LINQ クエリを記述するための開始点として使用できます。 これは LINQ の詳細な説明に適した場所ではありませんが、いくつかの簡単な例を次に示します。

using (var context = new BloggingContext())
{
    // Query for all blogs with names starting with B
    var blogs = from b in context.Blogs
                   where b.Name.StartsWith("B")
                   select b;

    // Query for the Blog named ADO.NET Blog
    var blog = context.Blogs
                    .Where(b => b.Name == "ADO.NET Blog")
                    .FirstOrDefault();
}

DbSet と IDbSet は常にデータベースに対するクエリを作成し、返されたエンティティがコンテキストに既に存在する場合でも、常にデータベースへのラウンド トリップを伴います。 クエリは、次の場合にデータベースに対して実行されます。

  • foreach (C#) ステートメントまたは For Each (Visual Basic) ステートメントによって列挙されます。
  • これは、ToArrayToDictionaryToList などのコレクション操作によって列挙されます。
  • FirstAny などの LINQ 演算子は、クエリの最も外側の部分で指定されます。
  • 次のメソッドが呼び出されます。DbSet、DbEntityEntry.Reload、および Database.ExecuteSqlCommand の Load 拡張メソッド。

データベースから結果が返されると、コンテキストに存在しないオブジェクトがコンテキストにアタッチされます。 オブジェクトが既にコンテキスト内にある場合は、既存のオブジェクトが返されます (エントリ内のオブジェクトのプロパティの現在の値と元の値は、データベース値で上書き されません )。

クエリを実行すると、コンテキストに追加されたが、データベースにまだ保存されていないエンティティは、結果セットの一部として返されません。 コンテキスト内のデータを取得するには、「 ローカル データ」を参照してください。

クエリがデータベースから行を返さない場合、結果は null ではなく空のコレクションになります。

主キーを使用したエンティティの検索

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

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

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

主キーによるエンティティの検索

次のコードは、Find の一部の使用方法を示しています。

using (var context = new BloggingContext())
{
    // Will hit the database
    var blog = context.Blogs.Find(3);

    // Will return the same instance without hitting the database
    var blogAgain = context.Blogs.Find(3);

    context.Blogs.Add(new Blog { Id = -1 });

    // Will find the new blog even though it does not exist in the database
    var newBlog = context.Blogs.Find(-1);

    // Will find a User which has a string primary key
    var user = context.Users.Find("johndoe1987");
}

複合主キーによるエンティティの検索

Entity Framework を使用すると、エンティティは複合キーを持つことができます。これは、複数のプロパティで構成されるキーです。 たとえば、特定のブログのユーザー設定を表す BlogSettings エンティティを作成できます。 ユーザーはブログごとに BlogSettings を 1 つだけ持つことになるので、BlogSettings の主キーを BlogId と Username の組み合わせにすることを選択できます。 次のコードは、BlogId = 3、Username = "johndoe1987" を持つ BlogSettings の検索を試みます。

using (var context = new BloggingContext())
{
    var settings = context.BlogSettings.Find(3, "johndoe1987");
}

複合キーがある場合は、ColumnAttribute または fluent API を使用して複合キーのプロパティの順序を指定する必要があることに注意してください。 Find の呼び出しでは、キーを形成する値を指定するときにこの順序を使用する必要があります。