使用LINQ模拟SQL Server 2012延迟窗口功能

woo*_*gie 5 c# sql linq sql-server

我有一些样本数据看起来像:(编辑:我没有SQL Server 2012)

create table #base
(pat_id int
,admission_date date
,discharge_date date
)
go
insert into #base
values
(1, '2007-01-04',   '2007-01-04'),
(1, '2007-01-10',   '2007-01-10'),
(1, '2007-01-11',   '2007-01-11'),
(1, '2007-01-18',   '2007-01-18'),
(1, '2007-01-24',   '2007-01-24'),
(1, '2008-01-25',   '2008-01-26'),
(2, '2007-02-01',   '2007-02-01'),
(2, '2007-02-06',   '2007-02-06'),
(2, '2007-02-07',   '2007-02-07'),
(2, '2007-02-08',   '2007-02-08')
Run Code Online (Sandbox Code Playgroud)

这是我希望用LINQ模拟的SQL查询

;with cte 
as
(
    select   pat_id
            ,admission_date
            ,discharge_date
            ,ROW_NUMBER() over(partition by pat_id order by admission_date asc) as rn
    from #base
)
select   firstCte.pat_id
        ,firstCte.discharge_date as firstAdmitReference
        ,secondCte.admission_date as dischargeReference
        ,case when DATEDIFF(DAY,firstCte.discharge_date,secondCte.admission_date) <= 30 then 1 else 0 end Readmit
from cte as firstCte
inner join cte as secondCte
      on firstCte.pat_id = secondCte.pat_id
where firstCte.rn = secondCte.rn -1 
Run Code Online (Sandbox Code Playgroud)

以下是该查询的结果:

create table #readmit_data
( pat_id int
 ,admission_date date
 ,discharge_date date
 ,within_x_days int
 )
insert into #readmit_data(pat_id,admission_date,discharge_date,within_x_days)
values

(1, '2007-01-04',   '2007-01-10',   1),
(1, '2007-01-10',   '2007-01-11',   1),
(1, '2007-01-11',   '2007-01-18',   1),
(1, '2007-01-18',   '2007-01-24',   1),
(1, '2007-01-24',   '2008-01-25',   0),
(2, '2007-02-01',   '2007-02-06',   1),
(2, '2007-02-06',   '2007-02-07',   1),
(2, '2007-02-07',   '2007-02-08',   1)
Run Code Online (Sandbox Code Playgroud)

在此结果集中,数据的基本格式为

patient ID dischargeDate nextVisitAdmitDate
Run Code Online (Sandbox Code Playgroud)

within_x_days列中的1 表示患者在最后一次出院30天后再次入院.理想情况下,30将是用户输入的变量.

LINQ中有哪种构造可用于此?

gh9*_*gh9 3

LinqToSql 没有与 lag/lead/row_number 类似的函数。

您还不能做到这一点,最简单的方法是将 SQL 发送到机器,然后在返回时将结果集映射到您的对象。