엔터티 쿼리 및 찾기

이 항목에서는 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) 문으로 열거됩니다.
  • ToArray, ToDictionary 또는 ToList와 같은 컬렉션 작업에 의해 열거됩니다.
  • First 또는 Any와 같은 LINQ 연산자는 쿼리의 가장 바깥쪽 부분에 지정됩니다.
  • DbSet, DbEntityEntry.Reload 및 Database.ExecuteSqlCommand의 Load 확장 메서드를 호출합니다.

데이터베이스에서 결과가 반환되면 컨텍스트에 없는 개체가 컨텍스트에 연결됩니다. 개체가 이미 컨텍스트에 있는 경우 기존 개체가 반환됩니다(항목에 있는 개체 속성의 현재 값과 원래 값은 데이터베이스 값으로 덮어쓰 지 않음 ).

쿼리를 수행할 때 컨텍스트에 추가되었지만 데이터베이스에 아직 저장되지 않은 엔터티는 결과 집합의 일부로 반환되지 않습니다. 컨텍스트에 있는 데이터를 얻으려면 로컬 데이터를 참조하세요.

쿼리가 데이터베이스에서 행을 반환하지 않으면 결과는 null이 아닌 빈 컬렉션이 됩니다.

기본 키를 사용하여 엔터티 찾기

DbSet의 Find 메서드는 기본 키 값을 사용하여 컨텍스트에서 추적되는 엔터티를 찾으려고 시도합니다. 컨텍스트에서 엔터티를 찾을 수 없는 경우 해당 엔터티를 찾기 위해 쿼리가 데이터베이스로 전송됩니다. 엔터티가 컨텍스트 또는 데이터베이스에 없는 경우 Null이 반환됩니다.

찾기는 두 가지 중요한 방법으로 쿼리를 사용하는 방법과 다릅니다.

  • 데이터베이스에 대한 왕복은 지정된 키를 가진 엔터티가 컨텍스트에서 찾을 수 없는 경우에만 만들어집니다.
  • 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만 있기 때문에 BlogSettings의 기본 키를 BlogId와 Username의 조합으로 만들도록 선택할 수 있습니다. 다음 코드는 BlogId = 3 및 Username = "johndoe1987"이 있는 BlogSettings를 찾으려고 시도합니다.

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

복합 키가 있는 경우 ColumnAttribute 또는 흐름 API를 사용하여 복합 키의 속성에 대한 순서를 지정해야 합니다. 찾기 호출은 키를 형성하는 값을 지정할 때 이 순서를 사용해야 합니다.