У меня есть ситуация, когда записи в родительской таблице (Record) могут иметь одну из двух связанных записей в дочерних таблицах (PhysicalPerson и Company). Один из столбцов будет всегда пустым.
При отображении записей в сетке пользовательского интерфейса пользователь должен видеть только одно из двух имен в столбце OwnerName, и пользователь должен иметь возможность сортировать столбец OwnerName без каких-либо знаний, если OwnerName для какой-либо записи получено от Company или PhysicalPerson.
Чтобы избежать денормализации данных, а также копирования и обслуживания столбца Имя, я попытался сделать все это в запросе Linq.
По сути, требуемое выражение SQL order by
, которое работает, должно выглядеть следующим образом:
ORDER BY CONCAT(Record.PhysicalPerson.Name,
Record.PhysicalPerson.Surname,
Record.Company.Name)
Это автоматически игнорирует значения NULL, и результаты выглядят приемлемыми.
Поэтому я попытался реализовать это в Linq:
query = query.OrderBy(x => x.PhysicalPerson.Name +
x.PhysicalPerson.Surname +
x.Company.Name);
но результирующий запрос, сгенерированный Entity Framework, выглядит следующим образом:
[Extent4].[Name] + [Extent6].[Surname] + [Extent8].[Name] AS [C1]
...
ORDER BY [Project1].[C1] ASC
...
Очевидно, + не работает вместо CONCAT в SQL.
Есть ли способ заставить EntityFramework генерировать CONCAT вместо + для конкатенации строк в OrderBy?
Если нет, то, я думаю, мне придется создать отдельное представление SQL с вычисляемым столбцом для этой конкретной сетки пользовательского интерфейса (в любом случае это может быть более правильным решением).