Конечно, есть способ представить временные таблицы в контексте Entity Framework.
Но, прежде чем я начал объяснять, как использовать временные таблицы в контексте Entity Framework, я хочу объяснить, какова была моя цель: чтобы достичь такой возможности.
Итак, начнем ...
Моя цель состояла в том, чтобы добавить сущность, представляющую временную таблицу из БД, и написать запрос LINQ для загрузки данных в нее. Позже, в коде, я хотел использовать его в LINQ, так как я использую любую другую сущность, представляющую постоянную таблицу.
Похоже, шаги для ее достижения очень просты с точки зрения T- SQL :
- создать временную таблицу
- загрузить в нее данные
- использовать позже в коде
, но из C# это не так тривиально, потому что мне пришлось выяснить:
- как получить перевод из запроса LINQ T- SQL со всеми параметрами
- как объявить сущность, представляющую временную таблицу в БД и отличную guish ее от других сущностей
- как загрузить данные во временную сущность
- как получить порядок параметров из запроса LINQ, используемого для загрузки данных во временную table
- как обрабатывать зависимости между временными таблицами
- как прикрепить подготовленный «временный запрос» к DbContext
- ....
В любом случае , после некоторого поиска исходного кода Entity Framework 6 и поиска в Inte rnet Я нашел то, что мне нужно, и, наконец, у меня есть доказательства и концепция, а затем первая версия.
Вот очень простое использование:
-
объявить временную сущность
[Table("#tempAddress")]
public class AddressTempTable : ITempTable
{
[Key]
[TempFieldTypeAttribute("int")]
public int AddressId { get; set; }
[TempFieldTypeAttribute("varchar(200)")]
public string StreetName { get; set; }
}
добавить сущность, представляющую временную таблицу в коллекции DbSet
public DbSet<AddressTempTable> AddressesTempTable { get; set; }
загрузить данные
var tempAddressQuery = entityContext.Addresses.Select(a => new AddressTempTableDto { AddressId = a.AddressId , StreetName = a.StreetName });
Присоедините и используйте его
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 пример .
Исходный код доступен здесь .