Хотите загрузить только поля из текущего объекта?
Вам необходимо отключить отложенную загрузку в вашем DbContext
. Это можно отключить, установив для LazyLoadingEnabled
значение false в конструкторе DbContext
:
public partial class SampleContext : DbContext
{
public SampleContext (): base(...)
{
// disable lazy-loading in your db-context
Configuration.LazyLoadingEnabled = false;
}
}
Затем, когда вы запускаете запрос, он запрашивает только поля, связанные с выбранным DbSet
. Например, представьте, что у нас есть City
и Country
сущности.
Таблица городов
CityId | Name | CountryId
-------------------------
1 | Tehran | 98
Таблица стран
CountryId | Name | Culture
-------------------------
98 | Iran | fa-IR
И их модели сущностей имеют вид:
public class Country
{
public int CountryId{get;set;}
pulic string Name{get;set;}
public string Culture{get;set;}
}
public class City
{
public int CityId{get;set;}
public string Name{get;set;}
public Country Country{get;set;}
}
Мы собираемся выбрать город с идентификатором 1:
using(var dbContext = new SampleDbContext())
{
var city = dbContext.Cities.SingleOrDefault(c => c.CityId == 1);
var country = city.Country;
// country will be null
// because EF didn't fetch its data, because it's an eager-load
}
Запрос выше генерирует запрос как:
SELECT * FROM Cities WHERE CityId = 1
И как я упоминал в комментариях к коду выше, City.Country
будет нулевым из-за использования eager-loading
. В этом случае для загрузки свойств навигации вы можете использовать метод Include
.
using(var dbContext = new SampleDbContext())
{
var city = dbContext.Cities
.Include(c => c.Country)
.SingleOrDefault(c => c.CityId == 1);
}
Запрос сгенерирует SQL:
SELECT * FROM Cities ci
INNER JOIN Countries c ON ci.CountryId = c.CountryId
Помимо загруженности, не забывайте, что вы всегда можете использовать проекцию в своих запросах. Например, в нашем примере нам нужно выбрать только CityName и CountryName:
using(var dbContext = new SampleDbContext())
{
var cities=dbContext.Cities
.Include(c => c.Country)
.Select(new {CityName=c.Name, CountryName=c.Country.Name}
.ToList();
}
Это выбирает только два столбца:
SELECT
ci.Name as CityName,
c.Name as CountryName
FROM
Cities ci
INNER JOIN Countries c
ON ci.CountryId = c.CountryId
Я надеюсь, что смогу описать это вам хорошо.