首页 > 解决方案 > Linq to SQL 处理可空值

问题描述

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

LinqPad 上的 Linq 命令

标签: c#sql-serverlinqtsql

解决方案


我希望我正确理解了您的要求。错误(在发布答案后编辑之前包含在 OP 中的屏幕截图中)被抛出,因为您正在将 a 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

推荐阅读