수색…


비고

모델이 올바르게 관련되어 있으면 EntityFramework를 사용하여 관련 데이터를 쉽게로드 할 수 있습니다. 느린 로딩 , 열렬한 로딩명시 적 로딩 중에서 선택할 수있는 세 가지 옵션이 있습니다.

예제에 사용 된 모델 :

public class Company
{
    public int Id { get; set; }
    public string FullName { get; set; }
    public string ShortName { get; set; }

    // Navigation properties
    public virtual Person Founder { get; set; }
    public virtual ICollection<Address> Addresses { get; set; }
}

public class Address 
{        
    public int Id { get; set; }
    public int CompanyId { get; set; }
    public int CountryId { get; set; }
    public int CityId { get; set; }
    public string Street { get; set; }

    // Navigation properties
    public virtual Company Company { get; set; }
    public virtual Country Country { get; set; }
    public virtual City City { get; set; }
}

게으른로드

지연로드 는 기본적으로 사용됩니다. 지연로드는 파생 된 프록시 클래스를 만들고 가상 탐색 프로퍼티를 재정 의하여 수행됩니다. Lazy 로딩은 속성에 처음 액세스 할 때 발생합니다.

int companyId = ...;
Company company = context.Companies
    .First(m => m.Id == companyId);
Person founder = company.Founder; // Founder is loaded
foreach (Address address in company.Addresses)
{
    // Address details are loaded one by one.        
}

특정 탐색 속성에 대해 지연로드를 해제하려면 속성 선언에서 가상 키워드를 제거하십시오.

public Person Founder { get; set; } // "virtual" keyword has been removed

Lazy 로딩을 완전히 끄려면 Context 생성자와 같이 Configuration을 변경해야합니다.

public class MyContext : DbContext        
{
    public MyContext(): base("Name=ConnectionString")
    {
        this.Configuration.LazyLoadingEnabled = false;
    }
}

참고 : 직렬화를 사용하는 경우 Lazy 로딩을 꺼야합니다 . serializer는 모든 속성에 액세스하기 때문에 데이터베이스에서 모든 속성을로드합니다. 또한 탐색 속성 사이에서 루프를 실행할 수 있습니다.

열망하는 로딩

열망하는로드 는 필요한 엔티티를 즉시 로드 할 수있게합니다. 모든 엔티티가 하나의 데이터베이스 호출로 작업하도록하려면 Eager 로딩 이 필요합니다. 또한 여러 레벨을로드 할 수 있습니다.

관련 엔터티를로드하는 두 가지 옵션 이 있습니다. 강력한 형식의 메서드 또는 Include 메서드의 문자열 오버로드를 선택할 수 있습니다.

강력한 형식.

// Load one company with founder and address details
int companyId = ...;
Company company = context.Companies
    .Include(m => m.Founder)
    .Include(m => m.Addresses)
    .SingleOrDefault(m => m.Id == companyId);

// Load 5 companies with address details, also retrieve country and city
// information of addresses
List<Company> companies = context.Companies
    .Include(m => m.Addresses.Select(a => a.Country));
    .Include(m => m.Addresses.Select(a => a.City))
    .Take(5).ToList();

이 메서드는 Entity Framework 4.1부터 사용할 수 있습니다. using System.Data.Entity; 하여 참조가 있는지 확인하십시오 using System.Data.Entity; 세트.

문자열 과부하.

// Load one company with founder and address details
int companyId = ...;
Company company = context.Companies
    .Include("Founder")
    .Include("Addresses")
    .SingleOrDefault(m => m.Id == companyId);

// Load 5 companies with address details, also retrieve country and city
// information of addresses
List<Company> companies = context.Companies
    .Include("Addresses.Country");
    .Include("Addresses.City"))
    .Take(5).ToList();

명시 적 로딩

Lazy로드를 해제 한 후에는 항목에 대해 Load 메소드를 명시 적으로 호출하여 엔티티를 지연로드 할 수 있습니다. Collection컬렉션 을 가져 오는 데 사용되지만 참조 는 단일 탐색 속성을로드하는 데 사용됩니다.

Company company = context.Companies.FirstOrDefault();
// Load founder
context.Entry(company).Reference(m => m.Founder).Load();
// Load addresses
context.Entry(company).Collection(m => m.Addresses).Load();

Eager 로딩 에서 위 메서드의 오버 로드 를 사용하여 entiteis를 해당 이름으로 로드 할 수 있습니다.

Company company = context.Companies.FirstOrDefault();
// Load founder
context.Entry(company).Reference("Founder").Load();
// Load addresses
context.Entry(company).Collection("Addresses").Load();

관련 엔티티를 필터링합니다.

Query 메소드를 사용하여로드 된 관련 엔티티를 필터링 할 수 있습니다.

Company company = context.Companies.FirstOrDefault();
// Load addresses which are in Baku
context.Entry(company)
    .Collection(m => m.Addresses)
    .Query()
    .Where(a => a.City.Name == "Baku")
    .Load();

투영 검색어

관련 데이터가 비정규 화 된 형식이거나, 예를 들어 열의 하위 집합 만 필요로하는 경우 투영 쿼리를 사용할 수 있습니다. 추가 형식을 사용할 이유가 없으면 값을 익명 형식 으로 조인 할 가능성이 있습니다.

var dbContext = new MyDbContext();
var denormalizedType = from company in dbContext.Company
                       where company.Name == "MyFavoriteCompany"
                       join founder in dbContext.Founder
                       on company.FounderId equals founder.Id
                       select new 
                       {
                           CompanyName = company.Name,
                           CompanyId = company.Id,
                           FounderName = founder.Name,
                           FounderId = founder.Id
                       };

또는 쿼리 구문을 사용합니다.

var dbContext = new MyDbContext();
var denormalizedType = dbContext.Company
                       .Join(dbContext.Founder, 
                                    c => c.FounderId,
                                    f => f.Id ,
                                    (c, f) => new 
                                    {
                                        CompanyName = c.Name,
                                        CompanyId = c.Id,
                                        FounderName = f.Name,
                                        FounderId = f.Id
                                    })
                       .Select(cf => cf);


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow