【问题标题】:Null Checks for long datatype in Linq在 Linq 中对长数据类型进行空检查
【发布时间】:2014-09-23 01:55:49
【问题描述】:

我正在解决一个问题,我需要先查询数据库以确定输入记录是否会导致“重叠”日期跨度。 SQL 中相当简单的任务,但我似乎无法让它在 Linq 中工作。以下是相关的业务规则:

如果 Id1 == Id1 并且日期跨度重叠,则将发生冲突的记录返回给我 如果 Id2 == Id2 并且日期跨度重叠,则将冲突的记录带回 如果 Id1 == null 和 Id2 == null 并且日期跨度重叠,则将冲突的记录带回给我。

我的 linq 查询如下:

resultingOverlaps = (from overlapSpans in entities.ENTITIES
             where overlapSpans.CNTRCT_TYP_ID == contractId
             where (overlapSpans.ID1 == Id1 || overlapSpans.Id2 == Id2 ||
                   (overlapSpans.ID1 == null && overlapSpans.Id2 == null))
             where (
             (overlapSpans.EFF_DT < effDate && overlapSpans.END_DT >= effDate)
              || (overlapSpans.EFF_DT > effDate && overlapSpans.EFF_DT <= endDate)
              || (overlapSpans.EFF_DT == effDate)
             )
             select overlapSpans).ToList();

问题在于 Id1 和 Id2 的数据类型是 long?,因此无法以这种方式或迄今为止我尝试过的任何其他方式检查 null。 (测试 0,使用 '.HasValue' 等)

如何检查具有长数据类型的空值?

【问题讨论】:

  • 您是否查看过HasValue 的可空类型? msdn.microsoft.com/en-us/library/sksw8094(v=vs.110).aspx
  • 是的,我的帖子说我已经尝试过了。
  • 我的错,我错过了那一点。你的代码是编译运行还是不编译?
  • 它编译并运行得很好,它执行这个 linq 查询,但是在 Id1 == null && Id2 == null 的情况下它不返回任何记录(有很多情况它应该返回),因此我在插入时遇到了唯一性约束错误。
  • 属性ID1和ID2有什么类型?

标签: c# linq


【解决方案1】:

如果实体框架将这些属性创建为“long”,这意味着该列必须在数据库中指定为“NOT NULL”。

无需检查 null,因为overlapSpans.ID1 和overlapSpans.Id2 永远不会为null。

如果它们可以为空,EF 是否足够聪明,可以使它们的数据类型“长”? (可空)。

同样,类型为 long 的变量首先不能为 null。它们的默认值为“0”(使用默认值(Int64)验证),因此如果它们为“null”,它们将等于“0”。

【讨论】:

    猜你喜欢
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多