Linq-to-Entities查询中的格式化日期会导致exception

我有提交日期时间的Entity类,我想选择不同的’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 _months = new List(); foreach (var mname in env) { _months.Add(new SelectListItem() { Text = mname, Value = mname }); } 

错误信息:

LINQ to Entities无法识别方法’System.String ToString(System.String)’方法,并且此方法无法转换为商店表达式。

如何更正此错误消息?

谢谢SR

请记住,您的查询将被转换为SQL并发送到数据库。 查询不支持您尝试格式化日期,这就是您看到特定错误消息的原因。 您需要检索结果,然后在实现数据后进行格式化。

一种选择是简单地选择日期。 在迭代结果时,在将其添加到列表时对其进行格式化。 但是,您也可以使用方法链接在单个语句中使用格式化日期来构建列表。

 List _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(); 

方法.AsEnumerable()将强制执行查询的第一部分对数据库,其余部分将使用内存中的结果。

这是另一种选择:

 .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) 

显然DateName("MM", ..)拼出了月份名称,其中DatePart("mm", ..)提供了一个数值,因此是StringConvert( ) ,但是这左边用空格.Trim()结果,因此.Trim()

就像上面提到的Anthony Pegram一样,这种情况发生在数据库而不是C#中( .AsEnumerable()将所有数据拉到C#本地,所以请确保在使用之前过滤数据。)

显然,您需要稍微重新排列输出以适合yyyy-MM并使用DatePart作为数字,使用DateName作为月份名称。

这是使用常见的dd / MM / yyyy格式的替代方案。 在带有Entity Framework 5的SQL Server 2012上确认

 invoices.Select(i => new { FormattedDate = ( EntityFunctions.Right(String.Concat(" ", SqlFunctions.StringConvert((double?) SqlFunctions.DatePart("dd", i.DocumentDate))), 2) + "/" + EntityFunctions.Right(String.Concat(" ",SqlFunctions.StringConvert((double?) SqlFunctions.DatePart("mm", i.DocumentDate))), 2) + "/" + EntityFunctions.Right(SqlFunctions.StringConvert((double?) SqlFunctions.DatePart("yyyy", i.DocumentDate)), 4) ).Replace(" ", "0") } 

使用前导零以dd / MM / yyyy格式生成日期。

我使用了一种解决方法来手动构建包含yyyyMM的格式。 我想在这里提一下它是否可以帮助某人(至少暂时):

 FormattedDate = d.ReportDate.Year.ToString() + "-" + d.ReportDate.Month.ToString() 

这使格式yyyy-MM