添加结束日期以记录下一条记录的开始日期(linq to sql)

时间:2017-06-23 19:33:39

标签: c# linq-to-sql

地址表每个类型和员工有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

1 个答案:

答案 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顺序中的子句:fromwhere,[orderby],select并实现MIN,{{ 1}},MAXDISTINCT作为后缀函数完成。 LINQ理解语法作者决定不在语法中包含任何一元lambda函数。如果SQL在TOP中已经有一个表别名来匹配LINQ语法,那么它会有所帮助,但您总是可以添加一个(就像我对FROM所做的那样)。