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

我有一些样本数据看起来像:(编辑:我没有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') 

这是我希望用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 

以下是该查询的结果:

 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) 

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

 patient ID dischargeDate nextVisitAdmitDate 

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

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

LinqToSql没有延迟/导致/ row_number的类似函数。

您根本无法做到这一点,最简单的方法是将SQL发送到计算机,然后在结果集返回时将结果集映射到您的对象。

Window To LINQ是.NET的扩展函数库