【问题标题】:Use Linq query to compare date only with DateTime field使用 Linq 查询仅将日期与 DateTime 字段进行比较
【发布时间】:2013-02-08 18:11:52
【问题描述】:

我只需要比较涉及datetime 字段的 Linq 查询中的日期。但是,下面的语法会导致以下错误消息

The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

有人知道如何从datetime 字段中提取日期吗?

var duplicate = from a in _db.AgentProductTraining
                where a.CourseCode == course.CourseCode &&
                a.DateTaken.Date == course.DateTaken.Date &&
                a.SymNumber == symNumber
                select a;

【问题讨论】:

    标签: linq entity-framework datetime entity-framework-4


    【解决方案1】:

    这可能看起来有点迂回,但您可以使用 SqlFunctions 类的DateDiff 方法来执行此操作。只需传入两个值并使用“Day”来计算它们之间的天数差异(如果它们在同一天,则应该为 0)。

    如下:

    from a in _db.AgentProductTraining
                    where a.CourseCode == course.CourseCode &&
                    SqlFunctions.DateDiff("DAY", a.DateTaken, course.DateTaken) == 0 &&
                    a.SymNumber == symNumber
                    select a;
    

    【讨论】:

    • 如果日期在不同的日期,但间隔不到一天,例如Jan-5, 2013 23:30:00 和Jan-6, 2013 01:30:00,差异不会为零吗?
    • 不幸的是,这也不起作用。由于它嵌套在 Linq 查询中,我正在寻找原因但没有任何运气......
    • 还是抛出那个异常吗?
    • System.NotSupportedException:此函数只能从 LINQ 调用到实体。
    • @UsmanKhalid 这是正确的:您只能将此方法与 LINQ to Entities 调用一起使用。从有一个名为_db 的对象来看,我认为这个问题与这样的查询有关。
    【解决方案2】:

    你可以在System.Data.Objects命名空间下使用EntityFunctions.TruncateTime()

    例如

    db.Orders.Where(i => EntityFunctions.TruncateTime(i.OrderFinishDate) == EntityFunctions.TruncateTime(dtBillDate) && i.Status == "B")
    

    像魅力一样工作。

    更新

    此功能仅在您通过 LINQ 查询实体时有效。不要在 LINQ-Object 中使用。

    对于 EF6,使用 System.Data.Entity 命名空间下的 DbFunctions.TruncateTime()。

    【讨论】:

    • 嘿@AlexAngas,您可以检查以验证这在 EF4 中是否有效。你用的是哪个版本?
    • 我使用了 EF5 并得到了这个异常:System.NotSupportedException: This function can only be invoked from LINQ to Entities. at System.Data.Objects.EntityFunctions.TruncateTime(Nullable1 dateValue)`。我有什么遗漏吗?
    • @AlexAngas 此函数仅在您通过 LINQ 查询实体时有效。不要在 LINQ-Object 中使用。
    • 亲爱的投反对票的人,投反对票没有冒犯。但请评论缺少的内容/可以改进的地方,否则会破坏可能对有需要的人有用的问题的声誉。
    • EntityFunctions 在 EF6 中已弃用,应改为使用 DbFunctions。
    【解决方案3】:

    你可以这样做:

    var data1 = context.t_quoted_value.Where(x => x.region_name == "Pakistan" 
                            && x.price_date.Value.Year == dt.Year
                            && x.price_date.Value.Month == dt.Month
                            && x.price_date.Value.Day == dt.Day).ToList();
    

    【讨论】:

      【解决方案4】:

      你必须使用System.Data.Entity.DbFunctions.TruncateTime

      【讨论】:

        【解决方案5】:

        试试这个

        DateTime dt =course.DateTaken.Date;
        var duplicate = from a in _db.AgentProductTraining
                        where a.CourseCode == course.CourseCode &&
                        a.DateTaken == dt &&
                        a.SymNumber == symNumber
                        select a;
        

        如果 a.DateTaken 也包含时间,请参考这些链接来修改您的日期。
        Date 属性不能在 LINQ To Entities 中使用。

        Compare Dates using LINQ to Entities (Entity Framework)

        'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported

        http://forums.asp.net/t/1793337.aspx/1

        【讨论】:

          【解决方案6】:

          这就是我通过进行类似的日期搜索结束的方式,我还必须考虑时间(小时和分钟部分)

          from x in _db.AgentProductTraining
                          where 
                                 x.CreatedOn.Year == mydacourse.DateTakente.Year
                              && x.CreatedOn.Month == course.DateTaken.Month
                              && x.CreatedOn.Day == course.DateTaken.Day
                              && x.CreatedOn.Hour == course.DateTaken.Hour
                              && x.CreatedOn.Minute == course.DateTaken.Minute
                          select x;
          

          【讨论】:

            【解决方案7】:

            去掉.Date 如果字段是 DateTime,则可以与 == 进行比较

            var duplicate = from a in _db.AgentProductTraining
                            where a.CourseCode == course.CourseCode &&
                            a.DateTaken == course.DateTaken &&
                            a.SymNumber == symNumber
                            select a;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-05-20
              • 1970-01-01
              • 1970-01-01
              • 2016-11-12
              • 1970-01-01
              • 2014-08-01
              • 2013-07-20
              • 1970-01-01
              相关资源
              最近更新 更多