【问题标题】:How to use ToShortDateString in linq lambda expression?如何在 linq lambda 表达式中使用 ToShortDateString?
【发布时间】:2013-07-13 09:07:43
【问题描述】:

我需要在使用 lambda 表达式的 linq 查询中调用 ToShortDateString:

toRet.Notification = Repositories
    .portalDb.portal_notifications.OrderByDescending(p =>       p.id)
    .FirstOrDefault(p => p.date.ToShortDateString() == shortDateString);

但我得到了错误:

“System.NotSupportedException”类型的异常发生在 System.Data.Entity.dll 但未在用户代码中处理

附加信息:LINQ to Entities 无法识别该方法 'System.String ToShortDateString()' 方法,并且该方法不能 翻译成商店表达式。

考虑到我确实需要使用ToShortDateString(),我该怎么办?

谢谢。

【问题讨论】:

标签: c# linq entity-framework


【解决方案1】:

Linq to Entities 无法将 ToSortDateString 方法转换为 SQL 代码。你不能在服务器端调用它。将过滤移动到客户端(这会将所有数据从服务器传输到客户端),或者考虑使用server-side functions 将日期作为日期的一部分(您应该传递DateTime 对象而不是shortDateString):

EntityFunctions.TruncateTime(p.date) == dateWithoutTime

【讨论】:

  • 感谢您的快速回复。写入 FirstOrDefault(p => (EntityFunctions.TuncateTime(p.date) == shortDateString) 后,我收到错误 System.Data.Entity.dll 中发生“System.Data.EntityCommandExecutionException”类型的异常,但未在用户中处理代码附加信息:执行命令定义时发生错误。详情请参阅内部异常。如果有此异常的处理程序,则程序可以安全地继续。
  • @OctavianEpure 如上所述,而不是传递字符串 shortDateString 你应该传递 DateTime 对象
  • 使用EF6,我不得不使用DbFunctions.TruncateTime()
  • 使用 System.Data.Entity; .Select(a => DbFunctions.TruncateTime(a.MyDate))
【解决方案2】:

当您使用的是日期/时间数据时,您不应该强制进行字符串比较 - 一旦您强制进行字符串比较,您就会突然不得不处理如何字符串被格式化。

取而代之的是:

var endDate = targetDate.AddDays(1);

toRet.Notification = Repositories
.portalDb.portal_notifications.OrderByDescending(p =>       p.id)
.FirstOrDefault(p => p.date >= targetDate && p.date < endDate);

(假设targetDate 是您在代码中用于生成shortDateString 的任何DateTime 变量,并且已经是没有时间值的DateTime

【讨论】:

  • 我也在寻找这个问题的解决方案。在数据库中,我的日期可能类似于 2012-06-06 20:14:50.367。在查找 2012.06.06 发布的记录时,我必须将我搜索的日期从 2012.06.06 转换为 2012.06.05 23:59 或采用类似的技巧。我想通过以某种方式删除时间组件来避免它,但不是从搜索日期而是从数据库中的日期。向大家问好。非常好的门户,有很多有用的信息。
【解决方案3】:

试试这个,

你也可以使用下面的代码。

Activity = String.Format("{0} {1}", String.Format("{0:dd-MMM-yyyy}", s.SLIDESHEETDATE), String.Format("{0:HH:mm}", s.ENDDATETIME))

【讨论】:

    【解决方案4】:

    ToShortDateString() 方法通常仅用于处理日期并忽略时间戳。

    通过使用以下查询,您将获得准确的今天结果集。

    Repositories.portalDb.portal_notifications.OrderByDescending(p =>       p.id)
            .FirstOrDefault(p => p.date.Date == DateTime.Now.Date);
    

    通过使用DateTime 结构的Date 属性,您只能获取该日期的记录。

    注意:Linq to Objects。仅当您可以(或可以选择)绕过ToShortDateString() 方法时才有效

    【讨论】:

    • p.date.Date 会抛出异常。您不能在 LINQ to Entities 查询中执行此操作。
    • 你误解了我的意思。 dateDateTime 类型的属性。您可以使用CreatedDate 更改它。请先看问题...
    • 我了解dateDateTime 属性。我的意思是您不能在 LINQ to Entities 中使用 date.Date,因为它不知道如何将其转换为 SQL。
    • 你可以拿这个p.CreatedDate.Date。希望你明白:-)
    • 在 LINQ to Objects 中很好,但在 LINQ to Entities 中不是
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-18
    • 2020-06-18
    • 2017-06-10
    • 2013-03-29
    • 2023-03-12
    相关资源
    最近更新 更多