如何通过Entity Framework / Linq中的连接值进行排序?

问题描述 投票:1回答:2

我有一种情况,父表(记录)中的记录可以在子表(PhysicalPerson和Company)中具有两个相关记录之一。其中一列将始终为空。

在UI网格中显示记录时,用户应该只看到OwnerName列中的两个名称中的一个,如果任何记录的OwnerName来自Company或PhysicalPerson,则用户应该能够在不知情的情况下对列OwnerName进行排序。

为了避免非规范化数据以及复制和维护Name列,我试图在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);

但实体框架生成的结果查询如下所示:

[Extent4].[Name] + [Extent6].[Surname] + [Extent8].[Name] AS [C1]
...
ORDER BY [Project1].[C1] ASC
...

显然,+不能替代SQL中的CONCAT。

在OrderBy中,有没有办法让Entity Framework为字符串连接生成CONCAT而不是+?

如果没有,那么我想我将不得不为这个特定的UI网格创建一个带有计算列的单独的SQL视图(无论如何这可能是更正确的解决方案)。

c# sql-server linq
2个回答
1
投票

不幸的是,SQL / EF的LINQ转换器不使用CONCAT来翻译字符串连接,这与其他翻译期望SQL自动处理null的方式不一致(或者+的SQL定义与CONCAT的不同之处在于问题所在) 。无论如何,您可以将null测试显式化为:

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

您也可以使用+而不是String.Concat,但我认为使用String.Concat更容易看到意图。


0
投票

试试这个:

query = query.OrderBy(x => x.PhysicalPerson.Name).ThenBy(x.PhysicalPerson.Surname).ThenBy(x.Company.Name);
© www.soinside.com 2019 - 2024. All rights reserved.