我有一种情况,父表(记录)中的记录可以在子表(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视图(无论如何这可能是更正确的解决方案)。
不幸的是,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
更容易看到意图。
试试这个:
query = query.OrderBy(x => x.PhysicalPerson.Name).ThenBy(x.PhysicalPerson.Surname).ThenBy(x.Company.Name);