Linq to SQL处理可空值

时间:2019-11-27 20:26:05

标签: c# sql-server linq tsql

我有一个旧版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
                };

Linq command on LinqPad

1 个答案:

答案 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