Linq无法翻译ToShortDateString()

时间:2015-08-05 16:24:11

标签: c# linq

您能告诉我如何修复下面的查询。 LINQ正在制定我的日期,如下所示:2015年8月8日。我需要2015年8月8日。我尝试的每次尝试都给了我一个不同的错误信息。我究竟做错了什么。

var orgData = (from d in db.tbl_FormsSubmittedValues
               where d.SiteID == _siteID
               & d.FormID == _formID
               & ((d.tbl_FormsSubmitted.UserID == _userID && _viewOwnOnly) || !_viewOwnOnly)
               & ((_search != "" && d.Value.Contains(_search)) || _search == "")
               select new
               {
                   d.FormSubmissionID,
                   Value = d.ValueDate.HasValue ? d.ValueDate.Value.ToShortDateString(): d.ValueLong != null ? d.ValueLong : d.Value,
                   d.FieldID,
                   d.FormID,
                   d.SiteID,
                   d.tbl_FormsSubmitted,
                   d.tbl_FormsSubmitted.UserID,
               }).ToList();

Original Line那是给我写出日期而不是mm / dd / yyyy

 Value = d.ValueDate != null ? d.ValueDate.ToString() : d.ValueLong != null ? d.ValueLong : d.Value,

问题专栏:

Value = d.ValueDate.HasValue ? d.ValueDate.Value.ToShortDateString(): d.ValueLong != null ? d.ValueLong : d.Value,

错误:

Could not translate expression 'd.ValueDate.Value.ToShortDateString()' into SQL and could not treat it as a local expression.

3 个答案:

答案 0 :(得分:2)

创建新匿名对象的另一种方法是创建一个新的类型对象(例如select new Submission() { ... }),该对象公开一个只读属性以呈现一个短日期。这可能会为这种简单的操作增加一些开销,但它提供了一些灵活性(您可以在以后格式化更多字段)和性能(对数据库而不是在内存中执行任何其他查询或过滤操作)。

或者,您可以将管道向下推到表示层。让负责向用户显示数据的代码处理转换或显示短日期,并使您的数据/业务层保持精简并对其他解释保持开放。这将使您不必返回并更改查询或修改您的POCO以适应日期格式的首选项更改。例如,如果您有其他人喜欢将日期显示为YYYY-dd-MM,该怎么办?

答案 1 :(得分:1)

在实际的sql之外进行格式化。类似的东西:

orgData = (from d in db.tbl_FormsSubmittedValues
           where d.SiteID == _siteID
           & d.FormID == _formID
           & ((d.tbl_FormsSubmitted.UserID == _userID && _viewOwnOnly) || !_viewOwnOnly)
           & ((_search != "" && d.Value.Contains(_search)) || _search == "")
           select new {
                       d.FormSubmissionID,
                       Value = d.ValueDate.HasValue ? d.ValueDate.Value: d.ValueLong != null ? d.ValueLong : d.Value,
                       d.FieldID,
                       d.FormID,
                       d.SiteID,
                       d.tbl_FormsSubmitted,
                       d.tbl_FormsSubmitted.UserID
                      }).AsEnumerable() //Using this to get the query to run.
           //Anything after this should not be done on the database side.
           .Select(d => new
           {
               d.FormSubmissionID,
               Value = d.ValueDate.HasValue ? FormatDate(d.ValueDate.Value): d.ValueLong != null ? d.ValueLong : d.Value,
               d.FieldID,
               d.FormID,
               d.SiteID,
               d.tbl_FormsSubmitted,
               d.tbl_FormsSubmitted.UserID,
           }).ToList();


static string FormatDate(DateTime date)
{
    return  date.Value.ToShortDateString();
}

这样就可以保留格式化的实际生成的sql。

答案 2 :(得分:1)

我会建议:

Value = d.ValueDate.HasValue ? (d.ValueDate.Value.Day + "/" + d.ValueDate.Value.Month + "/" + d.ValueDate.Value.Year) : (d.ValueLong != null ? d.ValueLong : d.Value),

或者在显示数据时执行toshortstring(如果您在网站上使用它)

甚至可以使用解析日期(json)

通过javascript解析日期