使用Linq查询仅与DateTime字段比较日期。

10

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

指定的类型成员“Date”不受LINQ to Entities支持。 仅支持初始化程序、实体成员和实体导航属性。

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

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

15

虽然看起来有点绕,但你可以使用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;

如果两个日期不在同一天,但时间间隔小于一天,比如2013年1月5日23:30:002013年1月6日01:30:00,那么它们的差异是否为零? - Sergey Kalinichenko
不幸的是,这也没有起作用。由于它嵌套在Linq查询中,我正在努力找出原因,但没有任何运气... - NealR
它还是抛出了那个异常吗? - Corey Adler
System.NotSupportedException:此函数只能从LINQ to Entities中调用。 - Usman Khalid
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Corey Adler

13

您可以在命名空间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)`。我是否忽略了什么重要的事情? - Alex Angas
@AlexAngas 这个函数只在通过LINQ查询实体时有效。不要在LINQ-Object中使用。 - صفي
1
亲爱的点踩者,点踩并不会冒犯我。但请评论一下缺少了什么或有哪些潜在的改进空间,否则它会损害这个问题的声誉,而这个问题可能对某些需要帮助的人很有用。 - صفي
3
EntityFunctions在EF6中已被弃用,应使用DbFunctions代替。 - VahidNaderi

6
你可以像下面这样做:

你可以像下面这样做:

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();

3

您需要使用 System.Data.Entity.DbFunctions.TruncateTime


2

试一下这个

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同时包含时间信息,那么请参考以下链接修改日期。
在LINQ To Entities中无法使用Date属性。 使用LINQ to Entities(Entity Framework)比较日期 'Date'在LINQ to Entities中不受支持。仅支持初始化程序、实体成员和实体导航属性 http://forums.asp.net/t/1793337.aspx/1

0

这就是我如何完成一个类似的日期搜索,其中我还必须考虑时间(小时和分钟部分)

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;

0

嘿,当我构建一个查询时,下面的内容有效。

                    DateTime date = Convert.ToDateTime(SearchText); 
                    query = query.Where(x => x.Date.Month == date.Month
                                          && x.Date.Day == date.Day
                                          && x.Date.Year == date.Year);

// 如果这个函数对你有用,请让我知道,它会为我找到所搜索的日期


你可以使用 x.Date == date.Date 或者 x.Date.Equals(date.Date) - T.S.

0

有点丑,但是它按预期工作而不使用任何SQL函数:

var sessions = await Db.Set<Sessions>()
    .Where(x => x.Timetable == form.TimetableId)
    .Where(x => x.DateAndTimeOfSession >= form.BookingDate.Date) // <--
    .Where(x => x.DateAndTimeOfSession < form.BookingDate.Date.AddDays(1)) // <--
    .ToListAsync();

-1

去掉 .Date 如果该字段是 DateTime 类型,则可以使用 == 进行比较

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接