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

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作为月份名称.

  • 喜欢这个答案,但是当人们使用类而没有指出可以找到类的命名空间时,它会让我失望.SqlFunctions位于System.Data.Objects.SqlClient命名空间中.您需要在项目中引用System.Data.Entity程序集才能找到它. (4认同)