sfg*_*ups 9 c# linq linq-to-entities entity-framework-4
我有提交日期时间的实体类,我想选择不同的'mon-yyyy'格式的datetime字段值并填充下拉列表.
以下代码给出了错误:
var env = db.Envelopes.Select(d => new
{
d.ReportDate.Year,
d.ReportDate.Month,
FormattedDate = d.ReportDate.ToString("yyyy-MMM")
}).Select(d => d.FormattedDate)
List<SelectListItem> _months = new List<SelectListItem>();
foreach (var mname in env)
{
_months.Add(new SelectListItem() { Text = mname, Value = mname });
}
Run Code Online (Sandbox Code Playgroud)
错误信息:
LINQ to Entities无法识别方法'System.String ToString(System.String)'方法,并且此方法无法转换为商店表达式.
如何更正此错误消息?
谢谢SR
Ant*_*ram 14
请记住,您的查询将被转换为SQL并发送到数据库.查询不支持您尝试格式化日期,这就是您看到特定错误消息的原因.您需要检索结果,然后在实现数据后进行格式化.
一种选择是简单地选择日期.在迭代结果时,在将其添加到列表时对其进行格式化.但是,您也可以使用方法链接在单个语句中使用格式化日期来构建列表.
List<SelectListItem> _months = db.Envelopes.OrderByDescending(d => d.ReportDate)
.Select(d => d.ReportDate)
.AsEnumerable() // <-- this is the key method
.Select(date => date.ToString("MMM-yyyy"))
.Distinct()
.Select(formattedDate => new SelectListItem { Text = formattedDate, Value = formattedDate })
.ToList();
Run Code Online (Sandbox Code Playgroud)
该方法.AsEnumerable()将强制执行查询的第一部分对数据库,其余部分将在内存中处理结果.
Zac*_*ott 10
这是另一种选择:
.Select( p -> SqlFunctions.StringConvert((double)
SqlFunctions.DatePart("m", p.modified)).Trim() + "/" +
// SqlFunctions.DateName("mm", p.modified) + "/" + MS ERROR?
SqlFunctions.DateName("dd", p.modified) + "/" +
SqlFunctions.DateName("yyyy", p.modified)
Run Code Online (Sandbox Code Playgroud)
显然会DateName("MM", ..)拼出月份名称,在那里DatePart("mm", ..)提供一个数值,因此StringConvert( ),这个左边用空格填充结果,因此.Trim().
就像上面提到的Anthony Pegram一样,这发生在数据库中而不是C#中(.AsEnumerable()将所有数据都拉到C#中,因此请确保在使用之前过滤数据.)
显然,您需要稍微重新排列输出以适应yyyy-MM并使用DatePart作为数字或DateName作为月份名称.