【问题标题】:How do I perform Date Comparison in EF query?如何在 EF 查询中执行日期比较?
【发布时间】:2010-11-08 11:04:49
【问题描述】:

请帮忙。 我试图弄清楚如何在 linq 查询中使用 DATE 或 DATETIME 进行比较。

示例: 如果我想要今天之前开始的员工的所有员工姓名,我会在 SQL 中执行以下操作:

SELECT EmployeeNameColumn
FROM EmployeeTable
WHERE StartDateColumn.Date <= GETDATE() //Today

但是 linq 呢?

DateTime startDT = //Today

var EmployeeName =  
from e in db.employee
where e.StartDateColumn <= startDT 

上面的 WHERE 不起作用:

异常详细信息:System.NotSupportedException:LINQ to Entities 不支持指定的类型成员“日期”。仅支持初始化器、实体成员和实体导航属性。

【问题讨论】:

    标签: c# linq datetime linq-to-entities datetime-comparison


    【解决方案1】:

    使用DbFunctions 类来修剪时间部分。

    using System.Data.Entity;
    
    var bla = (from log in context.Contacts
               where DbFunctions.TruncateTime(log.ModifiedDate) 
                                  ==  DbFunctions.TruncateTime(today.Date)
               select log).FirstOrDefault();
    

    来源:http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/84d4e18b-7545-419b-9826-53ff1a0e2a62/

    【讨论】:

    • 正在为此苦苦挣扎,决定使用扩展方法,只是稍后才能找到有关此的信息-.-
    • 这应该是答案
    • EntityFunctions 已过时,由 DbFunctions 取代,更新答案以反映这一点
    • EntityFunctions 在 EF 6.0 中被替换。因此,如果您仍在使用 4.5 或更早版本(如我自己),您仍应使用 EntityFunctions。
    • 您是如何看到生成 DbFunctions.TruncateTime 的 sql 查询的:((convert (datetime2, convert(varchar(255), [Extent1].[InspectionReportInfo_Date], 102), 102)) = '2015 -02-10T00:00:00' 这会杀死任何索引,我会避免它...social.msdn.microsoft.com/Forums/en-US/…
    【解决方案2】:

    应该可以。您确定没有触发异常的查询的另一部分吗?我有几个表单查询实例

    var query = from e in db.MyTable
                where e.AsOfDate <= DateTime.Now.Date
                select e;
    

    在我的代码中。

    【讨论】:

    • 这有效:WHERE StartDateColumn
    • 这不是问题 - e.AsofDate.Date 是问题(仅比较日期部分 - 双方...
    【解决方案3】:

    这可能是由于数据库中的日期可以为空。试试这个:

    var EmployeeName =
    from e in db.employee
    where e.StartDateColumn.Value <= startDT 
    

    【讨论】:

    • “.Value”是我的顿悟。
    【解决方案4】:

    你可以像这样检查条件

    var nextDay = DateTime.Today.AddDays(1);
    
    var query = from e in db.MyTable
                where e.AsOfDate >= DateTime.Today && e.AsOfDate < nextDay 
                select e;
    

    在这里,您将获得 AsOfDate 日期的记录,因为我们在今天 (00:00:00) 和明天 (00:00:00) 之间进行检查,我们只会获得今天的日期记录,可能是时间。 .

    【讨论】:

      【解决方案5】:

      你不能使用.Date

      如果您想查看今天,您可以创建一个没有时间的日期时间

      DateTime myDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
      var e = (from mds in myEntities.Table
               where mds.CreateDateTime >= myDate
               select mds).FirstOrDefault();
      

      【讨论】:

        【解决方案6】:

        试试这个:

        DateTime dd = DateTime.Parse("08/13/2010 00:00:00");
        var data = from n in ContributionEligibilities
                   where n.ModifiedDateTime.Date >= DateTime.Parse("08/13/2010").Date
                   select n; 
        data.Dump("Result") ;
        

        【讨论】:

          【解决方案7】:

          我很好奇当您传递'DateTime' 时出现'Date' 的错误消息。难道'StartDateColumn'实际上是'Date',而不是数据库中的'DateTime'?这可能会打乱比较...

          【讨论】:

            【解决方案8】:

            使用局部变量存储 Date 值,然后在查询中使用该变量:

            DateTime today = DateTime.Now.Date; from scheme in context.schemes where scheme.EndDate > today select scheme

            【讨论】:

              【解决方案9】:

              我正在使用 LinqDataSource,但在获取包含日期比较的查询时遇到问题,无法正确执行。答案是使用 WhereAddParameters 函数并将测试值添加为强类型参数。

              请参见下面的示例,其中我正在匹配一个 groupid 并检查我的记录中的 StopDate 是否大于或等于现在的日期/时间戳。

              我目前正在使用这个代码片段,它就像一个魅力。

              LinqCampaigns.WhereParameters.Add("StopDate", System.Data.DbType.Date, DateTime.Now.ToString())
              LinqCampaigns.Where = "GroupId = " & myGrp & " &&  " & "StopDate >= @StopDate"
              

              像魅力一样工作......

              【讨论】:

                【解决方案10】:

                .Date 不起作用,但 .Day 对我有用。

                var query = from o in Payments
                    where o.Order.OrderDate.Day != o.PaymentDate.Day
                    orderby o.Order.OrderDate
                    select new
                    {
                     o.Order.OrderID,
                     o.Order.OrderDate,
                     o.PaymentDate,      
                     o.Order.FirstName,
                     o.Order.LastName,
                     o.Order.CustomerID
                    };
                
                
                query.Dump();
                

                【讨论】:

                • 这可能不是你想要的。它只会得到当月的一天。因此,例如,1 月 1 日和 2 月 1 日都有相同的“日”分量值,尽管实际上是不同的实时日期。
                【解决方案11】:

                确保您像这样检查空值:

                 '(from mm in _db.Calls 
                   where mm.Professionnal.ID.Equals(proid)
                   && mm.ComposedDate.HasValue &&
                   (mm.ComposedDate.Value >= datemin) && (mm.ComposedDate.Value <= date)
                   select mm).ToArray();'
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2023-03-15
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-11-24
                  • 1970-01-01
                  • 2023-04-04
                  • 1970-01-01
                  • 2013-09-16
                  相关资源
                  最近更新 更多