Я могу использовать временные таблицы в SQL Server 2016. Entity Framework 6, к сожалению, пока не знает эту функцию. Существует ли возможность обходного пути для использования новых параметров запросов (см. Msdn) в Entity Framework 6?
Я создал простой демонстрационный проект с временной таблицей сотрудников:
Я использовал edmx для сопоставления таблицы с сущностью (спасибо Мэтту Руве):
Все отлично работает с чистыми выражениями SQL:
using (var context = new TemporalEntities())
{
var employee = context.Employees.Single(e => e.EmployeeID == 2);
var query =
[email protected]"SELECT * FROM [TemporalTest].[dbo].[{nameof(Employee)}]
FOR SYSTEM_TIME BETWEEN
'0001-01-01 00:00:00.00' AND '{employee.ValidTo:O}'
WHERE EmployeeID = 2";
var historyOfEmployee = context.Employees.SqlQuery(query).ToList();
}
Можно ли добавить функциональность истории к каждой сущности без чистого SQL? Мое решение как расширение сущности с отражением манипулирования SQL-запросом из IQuerable
не идеально. Существует ли существующее расширение или библиотека для этого?
редактировать: (на основе комментария Павла)
Я пытался использовать табличную функцию:
CREATE FUNCTION dbo.GetEmployeeHistory(
@EmployeeID int,
@startTime datetime2,
@endTime datetime2)
RETURNS TABLE
AS
RETURN
(
SELECT
EmployeeID,
[Name],
Position,
Department,
[Address],
ValidFrom,
ValidTo
FROM dbo.Employee
FOR SYSTEM_TIME BETWEEN @startTime AND @endTime
WHERE EmployeeID = @EmployeeID
);
using (var context = new TemporalEntities())
{
var employee = context.Employees.Single(e => e.EmployeeID == 2);
var historyOfEmployee =
context.GetEmployeeHistory(2, DateTime.MinValue, employee.ValidTo).ToList();
}
Нужно ли создавать функцию для каждой сущности или есть общая опция?