#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), в котором уже есть соединение. В этом примере я бы использовал представление вместо исходного объекта.