您能告诉我如何修复下面的查询。 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.
答案 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解析日期