엔터티 쿼리 및 찾기Querying and Finding Entities

이 토픽에서는 LINQ 및 Find 메서드를 포함하여 Entity Framework를 사용하여 데이터를 쿼리할 수 있는 다양한 방법을 설명합니다.This topic covers the various ways you can query for data using Entity Framework, including LINQ and the Find method. 이 토픽에서 설명하는 방법은 Code First 및 EF 디자이너를 사용하여 만든 모델에 동일하게 적용됩니다.The techniques shown in this topic apply equally to models created with Code First and the EF Designer.

쿼리를 사용하여 엔터티 찾기Finding entities using a query

DbSet 및 IDbSet는 IQueryable을 구현하므로 데이터베이스에 대한 LINQ 쿼리를 작성하는 시작점으로 사용할 수 있습니다.DbSet and IDbSet implement IQueryable and so can be used as the starting point for writing a LINQ query against the database. 지금은 LINQ에 대해 자세히 알아보는 대신, 몇 가지 간단한 예제만 살펴보겠습니다.This is not the appropriate place for an in-depth discussion of LINQ, but here are a couple of simple examples:

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는 항상 데이터베이스에 대한 쿼리 만들며 반환된 엔터티가 이미 컨텍스트에 있더라도 항상 데이터베이스에 대한 왕복이 포함됩니다.Note that DbSet and IDbSet always create queries against the database and will always involve a round trip to the database even if the entities returned already exist in the context. 다음과 같은 경우 데이터베이스에 대해 쿼리가 실행됩니다.A query is executed against the database when:

  • foreach(C#) 또는 For Each(Visual Basic) 문에 의해 열거된 경우.It is enumerated by a foreach (C#) or For Each (Visual Basic) statement.
  • ToArray, ToDictionary 또는 ToList와 같은 컬렉션 작업에 의해 열거된 경우.It is enumerated by a collection operation such as ToArray, ToDictionary, or ToList.
  • 쿼리의 가장 바깥쪽 부분에 First 또는 Any 같은 LINQ 연산자가 지정된 경우.LINQ operators such as First or Any are specified in the outermost part of the query.
  • DbSet의 Load 확장 메서드, DbEntityEntry.Reload 메서드 및 Database.ExecuteSqlCommand 메서드가 호출됩니다.The following methods are called: the Load extension method on a DbSet, DbEntityEntry.Reload, and Database.ExecuteSqlCommand.

데이터베이스에서 결과가 반환되면 컨텍스트에 없는 개체는 컨텍스트에 연결됩니다.When results are returned from the database, objects that do not exist in the context are attached to the context. 개체가 이미 컨텍스트에 있는 경우 기존 개체가 반환됩니다(항목 개체 속성의 현재 값과 원래 값을 데이터베이스 값으로 덮어쓰지 않습니다).If an object is already in the context, the existing object is returned (the current and original values of the object's properties in the entry are not overwritten with database values).

쿼리를 수행하면 컨텍스트에 추가되었지만 아직 데이터베이스에 저장되지 않은 엔터티는 결과 집합의 일부로 반환되지 않습니다.When you perform a query, entities that have been added to the context but have not yet been saved to the database are not returned as part of the result set. 컨텍스트에 있는 데이터를 가져오는 방법은 로컬 데이터를 참조하세요.To get the data that is in the context, see Local Data.

쿼리가 데이터베이스의 어떤 행도 반환하지 않는 경우 결과는 null이 아니라 빈 컬렉션입니다.If a query returns no rows from the database, the result will be an empty collection, rather than null.

기본 키를 사용하여 엔터티 찾기Finding entities using primary keys

DbSet의 Find 메서드는 기본 키 값을 사용하여 컨텍스트에서 추적하는 엔터티를 찾으려고 시도합니다.The Find method on DbSet uses the primary key value to attempt to find an entity tracked by the context. 컨텍스트에서 엔터티를 찾을 수 없는 경우 쿼리를 데이터베이스로 보내서 데이터베이스에서 엔터티를 찾습니다.If the entity is not found in the context then a query will be sent to the database to find the entity there. 컨텍스트 또는 데이터베이스에 엔터티가 없으면 null이 반환됩니다.Null is returned if the entity is not found in the context or in the database.

Find는 다음과 같은 두 가지 측면에서 쿼리 사용과 큰 차이가 있습니다.Find is different from using a query in two significant ways:

  • 지정된 키가 있는 엔터티를 컨텍스트에서 찾을 수 없는 경우에만 데이터베이스에 대한 왕복이 만들어집니다.A round-trip to the database will only be made if the entity with the given key is not found in the context.
  • Find는 추가됨 상태인 엔터티를 반환합니다.Find will return entities that are in the Added state. 즉, Find는 컨텍스트에 추가되었지만 아직 데이터베이스에 저장되지 않은 엔터티를 반환합니다.That is, Find will return entities that have been added to the context but have not yet been saved to the database.

기본 키로 엔터티 찾기Finding an entity by primary key

다음 코드는 몇 가지 Find 사용 사례를 보여줍니다.The following code shows some uses of 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");
}

복합 기본 키로 엔터티 찾기Finding an entity by composite primary key

Entity Framework는 엔터티에 두 개 이상의 속성으로 구성되는 복합 키를 허용합니다.Entity Framework allows your entities to have composite keys - that's a key that is made up of more than one property. 예를 들어 특정 블로그에 대한 사용자 설정을 나타내는 BlogSettings 엔터티가 있을 수 있습니다.For example, you could have a BlogSettings entity that represents a users settings for a particular blog. 사용자는 BlogId 및 Username의 조합을 BlogSettings 기본 키로 만들기 위해 선택할 수 있는 블로그마다 오직 하나의 BlogSettings만 갖기 때문입니다.Because a user would only ever have one BlogSettings for each blog you could chose to make the primary key of BlogSettings a combination of BlogId and Username. 다음 코드는 BlogId = 3이고 Username = "johndoe1987"인 BlogSettings를 찾으려고 시도합니다.The following code attempts to find the BlogSettings with BlogId = 3 and Username = "johndoe1987":

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

복합 키가 있는 경우 ColumnAttribute 또는 흐름 API를 사용하여 복합 키 속성의 순서를 지정해야 합니다.Note that when you have composite keys you need to use ColumnAttribute or the fluent API to specify an ordering for the properties of the composite key. 키를 구성하는 값을 지정할 때 Find 호출에서 이 순서를 사용해야 합니다.The call to Find must use this order when specifying the values that form the key.