Как использовать внутреннее соединение с вычисляемым столбцом в ядре EF?

#c# #entity-framework #linq #entity-framework-core #fluent

Вопрос:

Недавно я обнаружил значение вычисляемого столбца в ядре EF:

 modelBuilder.Entitylt;Persongt;() .Property(p =gt; p.DisplayName) .HasComputedColumnSql("[LastName]   ', '   [FirstName]");  

Как бы вы выполнили внутреннее соединение с другой таблицей с помощью того же подхода?

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

1. Я бы вообще не стал использовать соединения. Работа EF Core заключается в создании соединений на основе отношений между сущностями. Если вам нужно использовать объединения в своих запросах, в модели отсутствуют связи

2. Я использую функцию наследования. Затем я использую переопределение виртуального свойства. В моем случае это разные типы запланированных событий, которые я хочу сохранить в одной таблице и дифференцировать с помощью дискриминатора. Объединение должно быть более эффективным вариантом по сравнению с внедрением DbContext в фактический класс.

3. Это не означает, что вы должны явно участвовать в запросах. Если вы укажете связи, EF Core создаст соединения при необходимости. Если вы объединяете вычисляемые столбцы или указываете отношения на их основе, вы получите наихудшую возможную производительность, если только вы не используете сохраненные и индексированные вычисляемые столбцы.

4. итак, скажем, у меня есть Проект.Заказчик. Как я могу получить имя клиента в качестве вычисляемого свойства?

5. Пожалуйста, объясните, для какой цели вам это нужно. Похоже, ты делаешь что-то не так.

Ответ №1:

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

Что мы можем здесь сделать, так это просто определить общий метод обогащения ScheduleEvent DisplayName или другие необходимые свойства:

 public class SchedulerEventWithDisplayName {  public ScheduleEvent Event { get; set; }  public string DisplayName { get; set; } }  

Образец обогатителя:

 public static IQueryablelt;SchedulerEventWithDisplayNamegt; EnrichWithDisplayName(IQueryablelt;ScheduleEventgt; source) {  return source.Select(e =gt; new SchedulerEventWithDisplayName  {  Event = e,  DisplayName = e is ScheduleEvent1 ? ((ScheduleEvent1)e).Field1   ((ScheduleEvent1)e).Field2 :   e is ScheduleEvent2 ? ((ScheduleEvent2)e).NavigationProp.Value :  "Some Default Value";  }); }  

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