Как создать и использовать временную таблицу в Entity Framework, опираясь только на C # / LINQ - PullRequest
0 голосов
/ 13 февраля 2020

Entity Framework - мой первый выбор O / RM. Мы можем написать наши запросы к БД, используя C # / LINQ. Мы даже можем создать нашу модель в C# и легко перенести ее в БД. Никакого пользовательского кода доступа к данным, никакого смешанного кода доступа к данным с огромной строкой SQL, ...

Однако иногда я сталкивался с плохой работой из-за плохого запроса, сгенерированного Entity Framework, включая ошибка типа

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

Предложения типа здесь полезны, но мы ограничены, поскольку не можем создавать объекты временной таблицы в контексте Entity Framework.

Итак, я начал задаваться вопросом, как ввести временные таблицы в Entity Framework?

Есть ли простой способ сделать это?

1 Ответ

0 голосов
/ 13 февраля 2020

Конечно, есть способ представить временные таблицы в контексте Entity Framework.

Но, прежде чем я начал объяснять, как использовать временные таблицы в контексте Entity Framework, я хочу объяснить, какова была моя цель: чтобы достичь такой возможности.

Итак, начнем ...

Моя цель состояла в том, чтобы добавить сущность, представляющую временную таблицу из БД, и написать запрос LINQ для загрузки данных в нее. Позже, в коде, я хотел использовать его в LINQ, так как я использую любую другую сущность, представляющую постоянную таблицу.

Похоже, шаги для ее достижения очень просты с точки зрения T- SQL :

  1. создать временную таблицу
  2. загрузить в нее данные
  3. использовать позже в коде

, но из C# это не так тривиально, потому что мне пришлось выяснить:

  1. как получить перевод из запроса LINQ T- SQL со всеми параметрами
  2. как объявить сущность, представляющую временную таблицу в БД и отличную guish ее от других сущностей
  3. как загрузить данные во временную сущность
  4. как получить порядок параметров из запроса LINQ, используемого для загрузки данных во временную table
  5. как обрабатывать зависимости между временными таблицами
  6. как прикрепить подготовленный «временный запрос» к DbContext
  7. ....

В любом случае , после некоторого поиска исходного кода Entity Framework 6 и поиска в Inte rnet Я нашел то, что мне нужно, и, наконец, у меня есть доказательства и концепция, а затем первая версия.

Вот очень простое использование:

  1. объявить временную сущность

    [Table("#tempAddress")]
    public class AddressTempTable : ITempTable
    {
        [Key]
        [TempFieldTypeAttribute("int")]
        public int AddressId { get; set; }
    
        [TempFieldTypeAttribute("varchar(200)")]
        public string StreetName { get; set; }
    }
    
  2. добавить сущность, представляющую временную таблицу в коллекции DbSet

    public DbSet<AddressTempTable> AddressesTempTable { get; set; }
    
  3. загрузить данные

    var tempAddressQuery = entityContext.Addresses.Select(a => new AddressTempTableDto { AddressId = a.AddressId , StreetName = a.StreetName });
    
  4. Присоедините и используйте его

    var addressList = entityContext
       .WithTempTableExpression<EntityContext>(tempAddressQuery)
       .AddressesTempTable.Join(entityContext.Addresses,
       (a) => a.AddressId,
       (aa) => aa.AddressId,
       (at, a) => new 
       {
            AddressId = at.AddressId,
            StreetName = a.StreetName
        }).ToList();
    

Я опубликовал свое решение в виде пакета Nuget под названием - EF6TempTableKit .

Вот очень базовый c пример .

Исходный код доступен здесь .

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