Вычисляемый столбец на основе строк из другой таблицы

#sql #.net-core #entity-framework-core #calculated-columns #ef-model-first

#sql #.net-core #entity-framework-core #вычисляемые столбцы #ef-модель-первая

Вопрос:

У меня есть следующая (упрощенная) таблица

 public class Door
{
    public int Id { get; set; }
    public bool Locked { get; set; }
}
 

Теперь проблема с этой таблицей заключается в том, что я не знаю, как долго дверь была заперта или нет. Я мог бы добавить новый столбец даты и времени, но тогда, если дверь была заблокирована, открыта и снова заблокирована, я бы не знал точно, когда она была заблокирована в первый раз, так как это было бы перезаписано. Итак, я добавил новую таблицу

 public class Locks
{
    public int Id { get; set; }
    public int DoorId { get; set; }
    public virtual Door Door { get; set; }
    public DateTime? LockedFrom { get; set; }
    public DateTime? LockedTo { get; set; }
}
 

и добавил a public Collection<Locks> в мою таблицу Door. Это все хорошо и хорошо, и решило бы мою первую проблему. Однако дверь и дверь.Locked широко используется во всем нашем коде, и изменение всех этих запросов было бы очень большой работой. Итак, я надеялся, что смогу переписать Door.Заблокирован, чтобы быть вычисляемым столбцом. Он должен собирать записи для этой двери из Locks и сравнивать их даты и время с текущим временем, чтобы выяснить, заперта ли дверь прямо сейчас. Важно, чтобы это был вычисляемый столбец (обрабатываемый на стороне сервера), а не функция или вычисляемый параметр в сущности, поскольку это вызвало бы все запросы, которые фильтруют Door.Заблокирован для обработки в памяти (и у меня есть множество дверей в моей БД). Я бы также предпочел, если дверь.Заблокированный может быть не обнуляемым, чтобы избежать изменения его типа на Bool?, и это, по-видимому, возможно, если сделать столбец сохраненным. Я видел примеры вычисляемых столбцов в .NET Core, где они используются entityTypeBuilder.Property(x => x.Locked).HasComputedColumnSql("some sql formula") , но ни один из них не делает этого, когда формула зависит от содержимого другой таблицы.

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

Спасибо!

Комментарии:

1. Конечно, в SQL Server вычисляемые столбцы ограничены только данными в одной строке одной таблицы.

2. Вы можете преодолеть это ограничение, вызвав пользовательскую функцию со скалярным значением в вычисляемом столбце, но SQL server не сможет включить код функции в план запроса, поэтому обычно это плохо сказывается на производительности.