Linq where子句仅比较没有时间值的日期值

Fra*_*Thu 50 c# datetime linq-to-entities entity-framework compare

var _My_ResetSet_Array = _DB
    .tbl_MyTable
    .Where(x => x.Active == true
        && x.DateTimeValueColumn <= DateTime.Now)
    .Select(x => x);
Run Code Online (Sandbox Code Playgroud)

上层查询工作正常.
但我只想检查日期值.
但是上层查询检查日期+时间值.

在传统的mssql中,我可以编写如下的查询.

SELECT * FROM dbo.tbl_MyTable
WHERE 
CAST(CONVERT(CHAR(10), DateTimeValueColumn, 102) AS DATE) <= 
            CAST(CONVERT(CHAR(10),GETDATE(),102) AS DATE)
AND
Active = 1
Run Code Online (Sandbox Code Playgroud)

所以任何人都可以给我建议我怎样才能检查Linq中的日期值.

Joh*_*ais 109

还有EntityFunctions.TruncateTimeDbFunctions.TruncateTime在EF 6.0中

  • 这很有效.只需注意您可以(实际上必须)在数据库列和C#DateTime.Now上使用TruncateTime.这是我使用的LINQ语句:`mydata.Where(t => t.ExpirationDate == null ||(t.ExpirationDate!= null && DbFunctions.TruncateTime(t.ExpirationDate.Value)> DbFunctions.TruncateTime(DateTime.Now) )));` (3认同)
  • 如果因 EntitiyFunction 被弃用而出现错误,请将 EntityFunctions 替换为 DbFunctions。 (2认同)
  • 如果这个答案包含使用这些函数的示例,或者至少参考一些包含一些示例的资源,我会更感激 (2认同)

Pra*_*ana 18

此问题的简单解决方法是仅比较日期部分

var _My_ResetSet_Array = _DB
                    .tbl_MyTable
                    .Where(x => x.Active == true && 
                               x.DateTimeValueColumn.Year == DateTime.Now.Year
                            && x.DateTimeValueColumn.Month == DateTime.Now.Month
                            && x.DateTimeValueColumn.Day == DateTime.Now.Day);
Run Code Online (Sandbox Code Playgroud)

因为linq to entity不支持'Date'数据类型,因为Year,Month和Day是'int'数据类型并且受支持.

  • TruncateOffset 函数是否可以获取 DateTimeOffset 的 DateTime 部分?似乎不可能用实体框架引用 DateTimeOffset 的 DateTime 部分,这使得它毫无用处。 (2认同)