代码之家  ›  专栏  ›  技术社区  ›  echo

ObjectQuery中的日期时间比较。其中

  •  1
  • echo  · 技术社区  · 15 年前

    我使用的是实体框架,我有一个注释实体。注释具有DATEMODIFIED属性,该属性是可为空的日期。我正在尝试构建一个查询,该查询将按日期过滤注释,因此我创建了一个startDate对象,并执行以下操作:

    Dim q As ObjectQuery(Of COMMENT) = _ 
       (From c In model.COMMENT Select c)
    
    If startDate.HasValue Then
       q = q.Where(Function(c) startDate.Value <= c.DATEMODIFIED)
    End If
    

    问题是q.toList()没有返回任何注释,尽管我认为应该返回。数据库中的所有注释都有DATEMODIFIED值,即使我传入DateTime.MinValue作为startDate,查询仍然不匹配任何实体。

    q.ToList()(0).DATEMODIFIED    'Returns the expected date 
    startDate.Value               'Returns the expected date 
    startDate.Value <= q.ToList()(0).DATEMODIFIED    'Returns True...
    

    但是一旦它到达q=q.Where(谓词)部分,q.ToList()就不再返回任何条目。我被难住了。

    1 回复  |  直到 14 年前
        1
  •  2
  •   Justin Grant    15 年前

    更新: 哎呀,我忘了,使用LINQtoEntities,所有表达式都被转换为SQL调用,而不是在代码中进行后处理——因此下面的调试建议不一定有效。

    因此,我首先对您的数据库运行相同的生成的SQL语句,并验证您的实体框架提供程序生成的SQL是否实际返回了您期望的数据@Craig Stuntz在上面的评论肯定是正确的,可以帮助你做到这一点。一旦有了参数化的SQL,我将尝试直接从代码中执行该SQL(使用 System.Data.OracleClient ObjectQuery.Parameters . 或者,您可以将参数粘在自己的身上,并从您选择的Oracle客户端应用程序执行查询。

    诊断此问题的一些想法:

    首先,在您的手表窗口中尝试以下操作:

    q.Where(Function(c) startDate.Value <= c.DATEMODIFIED).Count()
    

    接下来,我将尝试以稍微不同的方式定义LINQ查询——不要单独添加Where(),而是尝试使用两个查询,如下所示:

    Dim q As ObjectQuery(Of COMMENT)
    If startDate.HasValue Then
        q = (From c In model.COMMENT Where startDate.Value <= c.DATEMODIFIED Select c)
    Else
        q = (From c In model.COMMENT Select c)
    End If
    

    如果这仍然不起作用,我诊断的下一步将是验证where子句中的代码是否正在被调用,并检查传递到该代码中的值。我不知道如何像在C#中那样在VB中设置行内断点,但您可以轻松(暂时)将lambda重构为单独的函数并在那里设置断点。这样地:

    Sub Main()
        Dim testDate As Date = New Date(2005, 1, 1)
        Dim x = New List(Of Date?)
        x.Add(New Date(2009, 1, 1))
        x.Add(New Date(2008, 1, 1))
        x.Add(New Date(2007, 1, 1))
        x.Add(New Date(2006, 1, 1))
        x.Add(New Date(2005, 1, 1))
        x.Add(New Date(2004, 1, 1))
        x.Add(New Date(2003, 1, 1))
        x.Add(New Date(2002, 1, 1))
        x.Add(New Date(2001, 1, 1))
        Dim y = From n In x Select n
        y = y.Where(Function(val) test(val, testDate))
        Dim z = y.ToArray()
    End Sub
    
    Function test(ByVal date1 As Date, ByVal date2 As Date) As Boolean
        test = date1 >= date2
    End Function
    

    检查发送到比较函数中的值是否有效?比较是否会返回您期望的结果?