Как получить оригинальные атрибуты данных? - PullRequest
0 голосов
/ 05 июля 2019

Я получаю данные в инфраструктуре сущностей, однако при использовании Dbcontext.Classname он дает мне все атрибуты, которые поступают из объединенной таблицы в эту таблицу.
Однако я хочу получить только оригинальные атрибуты этой таблицы.Как я могу это сделать?

1 Ответ

0 голосов
/ 06 июля 2019

Хотите загрузить только поля из текущего объекта?

Вам необходимо отключить отложенную загрузку в вашем 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

Я надеюсь, что смогу описать это вам хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...