地址表每个类型和员工有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
答案 0 :(得分:0)
翻译很简单,虽然我没有尝试优化LINQ(也许是一组更高效)。
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
,{{ 1}},MAX
和DISTINCT
作为后缀函数完成。 LINQ理解语法作者决定不在语法中包含任何一元lambda函数。如果SQL在TOP
中已经有一个表别名来匹配LINQ语法,那么它会有所帮助,但您总是可以添加一个(就像我对FROM
所做的那样)。