【问题标题】:Linq-to-SQL to search only DATE portions of a dateLinq-to-SQL 仅搜索日期的 DATE 部分
【发布时间】:2012-05-25 17:12:24
【问题描述】:

我需要根据日期范围获取数据,例如:

SELECT * FROM MyTable WHERE 
myDate >= 'May 17 2012' AND 
myDate <= 'May 17 2012'

我在 LINQ 中编写了这个查询,问题是 LINQ 正在将此查询转换为:

SELECT * FROM MyTable WHERE 
myDate >= 'May 17 2012 12:00:00:000AM' AND 
myDate <= 'May 17 2012 12:00:00:000AM'

问题是 LINQ 也在考虑时间部分,但我只需要搜索日期部分。

谁能帮帮我?

谢谢。

【问题讨论】:

    标签: sql-server-2008 linq-to-sql date comparison


    【解决方案1】:

    只是想与您分享我找到了解决方案!

    EntityFunctions 为我们提供了 TruncateTime(),可以用于此目的。

    EntityFunctions.TruncateTime

     from e in MyContext.MyTable.Where(a =>
     EntityFunctions.TruncateTime(a.DateTimeColumn) ==   
     EntityFunctions.TruncateTime(DateTime.Now))  select e;
    

    编辑: 对于 EntityFramework 6 及更高版本:

     from e in MyContext.MyTable.Where(a =>
     DbFunctions.TruncateTime(a.DateTimeColumn) ==   
     DbFunctions.TruncateTime(DateTime.Now))  select e;
    

    我找到了here

    【讨论】:

    • 仅供现在查看此内容的任何人参考:对于 EntityFramework 6,“EntityFunctions”已被弃用并替换为“DbFunctions”
    【解决方案2】:

    我今天也在寻找这个答案 - 在这里找到 Comparing Dates in Linq To SQL

    我还仔细检查了分析器,以确保它被翻译成 SQL

    from e in MyContext.MyTable.Where(a => a.DateTimeColumn.Date == DateTime.Now.Date)
    select e;
    

    【讨论】:

      【解决方案3】:

      你有两个选择

      from t in context.MyTable
      where t.MyDate <= maxDate.AddDays(1)
      select t
      

      from t in context.MyTable
      where t.MyDate.Date <= maxDate.Date
      select t
      

      第一个可能会提供更好的性能,因为第二个可能无法正确使用您的数据库索引。但第二个意图更明显。

      【讨论】:

      • 嗯。让我试试第二个对我来说还不错。
      • 错误:LINQ to Entities 不支持指定的类型成员“日期”。仅支持初始化器、实体成员和实体导航属性。
      【解决方案4】:

      您实际上并没有按日期部分搜索;在幕后日期是DateTime。 因此,要获得一天的行数,请这样想:

      我想获取所有 MyDate 大于或等于 5 月 17 日午夜且小于 5 月 18 日午夜的行。

      下面的查询就是这样做的。

      var startDate = new DateTime(2012, 05, 17);
      var endDate = new DateTime(2012, 05, 18);
      var result = 
      from row in context.MyTable
      where row.MyDate >= startDate &&
            row.MyDate < endDate
      select row;
      

      【讨论】:

        猜你喜欢
        • 2015-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多