Поиск…


замечания

Если модели правильно связаны, вы можете легко загрузить связанные данные с помощью 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; }
}

Ленивая загрузка

По умолчанию включена ленивая загрузка . Ложная загрузка достигается за счет создания производных прокси-классов и переопределения виртуальных навигационных прогнозов. Ленивая загрузка происходит, когда свойство открывается в первый раз.

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.        
}

Чтобы отключить Lazy для определенных свойств навигации, просто удалите ключевое слово virtual из объявления свойства:

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

Если вы хотите полностью отключить Lazy-загрузку, вам нужно изменить конфигурацию, например, в конструкторе контекста :

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

Примечание. Не забудьте выключить Lazy, если вы используете сериализацию. Поскольку сериализаторы получают доступ к каждой собственности, которую вы собираетесь загрузить из базы данных. Кроме того, вы можете запустить цикл между свойствами навигации.

Яркая загрузка

Высокая загруженность позволяет одновременно загружать все нужные вам объекты. Если вы предпочитаете, чтобы все ваши сущности работали в одном вызове базы данных, то Eager loading - это путь. Он также позволяет загружать несколько уровней.

У вас есть две возможности для загрузки связанных объектов, вы можете выбрать строго типизированные или строковые перегрузки метода 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; задавать.

Перегрузка строк.

// 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 вы можете лениво загружать объекты, явно вызывая метод Load для записей. Ссылка используется для загрузки свойств одиночной навигации, тогда как коллекция используется для получения коллекций.

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