我有一个旧版SQL脚本,通过比较日期范围为low_amt和high_amt的天数,将prob_contact表与其他表连接在一起。使用SQL可以正常工作。
JOIN prob_contact p ON (s.end_date - s.start_date) BETWEEN p.low_amt AND p.high_amt
我想将SQL脚本转换为Linq,但是在可为空的TimeSpan上遇到问题?请让我知道是否有解决此问题的方法。
let d = s.End_date - s.Start_date
Original T-SQL Command (datasource Oracle 12c by Joan Casteel)
SELECT (c.last + ', ' + c.first) AS name, s.start_date, s.end_date, p.con_freq
FROM dbo.criminals c INNER JOIN dbo.sentences s ON c.criminal_id = s.criminal_id
INNER JOIN dbo.prob_officers o ON o.prob_id = s.prob_id
JOIN prob_contact p ON (s.end_date - s.start_date) BETWEEN p.low_amt AND p.high_amt
ORDER BY name, s.start_date;
Linqpad script
var result = from c in Criminals
join s in Sentences on c.Criminal_id equals s.Criminal_id
let d = s.End_date - s.Start_date
from p in Prob_contacts where d < p.Low_amt
orderby c.Last
select new {
name = c.Last + ", " + c.First,
startDate = s.Start_date,
freq = p.Con_freq,
d
};
答案 0 :(得分:1)
希望我能正确理解您的要求。引发错误(在OP中随附的屏幕快照中,在发布答案后对其进行编辑之前,已抛出该错误),因为您正在将TimeSpan
(d为查询中的TimeSpan)与Int32
进行比较。根据您给出的描述,您想比较Low_amt的天数
您需要的是TimeSpan.TotalDays
from p in Prob_contacts where d.Value.TotalDays < p.Low_amt //(.Value) Since it is nullable as suggested in the error