如何在linq lambda表达式中使用ToShortDateString?

时间:2013-07-15 13:23:15

标签: c# linq entity-framework

我需要在一个使用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()

,我该怎么办?

感谢。

4 个答案:

答案 0 :(得分:22)

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

EntityFunctions.TruncateTime(p.date) == dateWithoutTime

答案 1 :(得分:5)

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

相反,有类似的东西:

var endDate = targetDate.AddDays(1);

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

(假设targetDate是您在代码中用于生成DateTime的{​​{1}}变量,并且已经是shortDateString,没有时间值)< / p>

答案 2 :(得分:-1)

试试这个,

您也可以使用以下代码。

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

答案 3 :(得分:-3)

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

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

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

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

注意:Linq to Objects。仅在您(或有选项)绕过ToShortDateString()方法

时才有效