地址表中每个类型和员工有 1 个或多个地址。每行都有一个地址生效日期,但没有结束日期。我需要使用员工的下一个地址生效日期来“伪造”结束日期。
源表是:
EFFDT ADDRESS1 ADDRESS_TYPE EMPLID
12/21/1999 7927 SW 31st Ave HOME 6
4/15/2002 7070 Shady Lane HOME 6
3/18/2014 1228 Hall HOME 6
结果应该是:
EFFDT ADDRESS1 ADDRESS_TYPE EMPLID ENDDATE
12/21/1999 7927 SW 31st Ave HOME 6 4/15/2002
4/15/2002 7070 Shady Lane HOME 6 3/18/2014
3/18/2014 1228 Hall HOME 6 NULL
我的 SQL 可以工作,但是让它在 Linq to SQL 中工作一直是个问题。我不确定 SQL 是否是最好的,因为它没有考虑类型。但目前,我所有的数据都只有 HOME 类型的地址。我也想考虑其他类型。这是 SQL:
Select A.EFFDT, A.ADDRESS1, A.ADDRESS_TYPE, A.EMPLID,
(SELECT MIN(EFFDT)
FROM dbo.PS_ADDRESSES
WHERE EFFDT > A.EFFDT AND EMPLID = A.EMPLID) as EndDate
FROM dbo.PS_ADDRESSES A
ORDER BY A.EMPLID
翻译很容易,虽然我没有尝试优化 LINQ(也许 group by 会更有效)。
from a in dbo.PS_ADDRESSES
orderby a.EMPLID
select new {
a.EFFDT, a.ADDRESS, a.ADDRESS_TYPE, a.EMPLID,
EndDate = (from na in dbo.PS_ADDRESSES where na.EFFDT > a.EFFDT && na.ADDRESS_TYPE == a.ADDRESS_TYPE && na.EMPLID == a.EMPLID select na.EFFDT).Min()
}
翻译时,只是翻译的LINQ顺序条款:from
,where
,[ orderby
],select
并认识到MIN
,MAX
,DISTINCT
和TOP
作为后缀的功能来完成。LINQ 理解语法作者决定不在语法中包含任何一元 lambda 函数。如果 SQL 中已经有一个表别名FROM
以匹配 LINQ 语法,这会有所帮助,但您始终可以添加一个(就像我在 中所做的那样na
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句