Как сделать заказ по объединенным значениям в Entity Framework / Linq? - PullRequest
1 голос
/ 10 апреля 2019

У меня есть ситуация, когда записи в родительской таблице (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 с вычисляемым столбцом для этой конкретной сетки пользовательского интерфейса (в любом случае это может быть более правильным решением).

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

К сожалению, трансляторы LINQ для SQL / EF не используют CONCAT для перевода конкатенации строк, что несовместимо с тем, как другие переводы ожидают, что SQL автоматически обработает нуль (или, возможно, определение SQL + отличается отCONCAT, где проблема лежит).В любом случае вы можете сделать нулевой тест явным образом, например, так:

query = query.OrderBy(x => String.Concat(x.PhysicalPerson.Name ?? "", x.PhysicalPerson.Surname ?? "", x.Company.Name ?? ""));

Вы также можете использовать + вместо String.Concat, но я думаю, что цель легче увидеть с помощью String.Concat.

0 голосов
/ 10 апреля 2019

Попробуйте это:

query = query.OrderBy(x => x.PhysicalPerson.Name).ThenBy(x.PhysicalPerson.Surname).ThenBy(x.Company.Name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...