TSQL 数组初始化和 LINQ Where on Array
Posted
技术标签:
【中文标题】TSQL 数组初始化和 LINQ Where on Array【英文标题】:TSQL Array Initialization and LINQ Where on Array 【发布时间】:2020-06-15 16:53:04 【问题描述】:我正在尝试对 T-SQL 中的地址执行字符串聚合,以便在逗号分隔的字符串中使用任何非 NULL 的地址字段。我知道如何在 C# 中执行此操作,但对 SQL 感到迷茫。
这是我目前所拥有的(我需要将 C# 部分转换为 SQL):
SELECT STRING_AGG
(
--Start of C# (I don't know how to convert this into SQL).
new[]
Addresses.Line1,
Addresses.Line2,
Addresses.Line3,
Addresses.City,
Addresses.County,
Addresses.State,
Countries.Name,
Addresses.Postcode
.Where(data => data != null)
--End of C#
,
', '
) Address
FROM Addresses
JOIN Countries ON Countries.Id = Addresses.CountryId
【问题讨论】:
尝试 DBNull.Value 而不是 null。 @jdweng 这里的问题是关于 TSQL 的; C# 纯粹是为了表达意图 【参考方案1】:然而,就我个人而言,我会将它们作为列带回来并担心应用程序代码中的格式!
STRING_AGG
真正用于连接 row 数据;你正在使用列,所以你最好做一些类似的事情:
SELECT CONCAT(Addresses.Line1,
N', ' + Addresses.Line2,
N', ' + Addresses.Line3,
-- ...
N', ' + Addresses.Postcode)
CONCAT
忽略 null
值,如果 some column
是 null
,N',' + some column
将是 null
,因此这将删除所有省略值的中间分隔符。它确实有点假设Line1
有一个值 - 没有它,可能会有一个前导逗号。如果需要,您可以删除它。
【讨论】:
嗯,它并不完美,但对于我需要它的目的来说已经足够了(如果通过 UI 输入,Line1
是强制性的)。
我确实想知道是否有一种方法可以使用sys.columns
或INFORMATION_SCHEMA
表将列转换为行 - 对于我的示例来说这可能有点过头了,但我有兴趣看看它是否可能。 以上是关于TSQL 数组初始化和 LINQ Where on Array的主要内容,如果未能解决你的问题,请参考以下文章
Linq to Entities基础之需要熟知14个linq关键字(from,where,select,group,let,on,by...)
刚学linq 菜鸟教程没看懂 from... in ...where... join ...in ...on...equals...into请大神简单教我下