Псевдонимы нескольких сущностей в ядре EF

#c# #.net-core #entity-framework-core

#c# #.net-ядро #entity-framework-core

Вопрос:

Предположим, у меня есть две сущности Units и UnitTypes :

 public class Units 
{
    public Units()
    {
        public int UnitId { get; set; }
        public int UnitTypeId { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
    }
}

public class UnitTypes
{
    public UnitTypes()
    {
        public int FruitTypeId { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
    }
}
 

Я хотел бы иметь общую функциональность псевдонимов для столбцов name и description . Этот псевдоним может быть основан на языке. Я знаю, что есть другие способы выполнения перевода, но нам требуются также другие псевдонимы, которые могут быть специфичны, например, для роли или пользователя. Я имел в виду следующую сущность для модели псевдонимов:

Псевдоним Сущность Столбец Идентификатор объекта (не FK) Язык Значение
{Guid} Единицы Имя Идентификатор Guid en-EN Груша
{Guid} Единицы Имя Идентификатор Guid nl-NL Одноранговый узел
{Guid} Типы единиц Имя Идентификатор Guid en-EN Фрукты
{Guid} Типы единиц Описание Идентификатор Guid en-EN Фрукты

Я хотел бы получить доступ и использовать псевдонимы в LINQ, предпочтительно за один раз. Могу ли я добавить псевдонимы, используя пользовательский метод расширения?

 var unit = await units.GetAll()
                      .Where(u => u.UnitId == request.UnitId)
                      .Select(u => new UnitDetailQueryModel()
                                      {
                                          UnitId = u.UnitId,
                                          Name = u.Name.GetAlias(),
                                          Description = u.Description.GetAlias(),        
                                          UnitTypeId = u.UnitTypeId,
                                          UnitTypeName = u.UnitType.Name.GetAlias(),
                                          UnitTypeDescription = u.UnitType.Description.GetAlias(),
                                      })
                      .SingleOrDefaultAsync(cancellationToken: cancellationToken);
 

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

1. Если в вашем проекте всего несколько таких запросов, даже не пытайтесь этого делать — напишите запрос LINQ с помощью LEFT join и извлекайте псевдонимы руками. Для реализации и отладки общего решения требуется сильное знание ExpressionTree и несколько дней для реализации.

2. Но если вам все еще это нужно, я могу дать вам совет, что вам нужно решить для достижения цели.

3. Да, эта функциональность должна быть предпочтительно общей, поскольку у меня слишком много похожих запросов для расширения каждого из них. Я также смотрю на представление БД (стиль code first), в котором уже есть соединение. В этом примере я бы использовал представление вместо исходного объекта.