LINQ表达式中的格式化字段

时间:2011-03-24 11:17:25

标签: linq format

我正在尝试从以下查询中呈现图表:

按月创建的调查问卷,并将月份格式化为mm / YYYY

我的代码:

    public ActionResult QuestionnairesByMonth() {

        var query = TrialDB.Questionnaires
            .GroupBy(r => new {
                Month = r.DateCreated.Month,
                Year = r.DateCreated.Year,
            })
            .Select(group => new {
                Date = string.Format("{0}/{1}", group.Key.Year, group.Key.Month),
                Total = group.Count()
            })
            .ToList();

        var chart = new Chart(400, 200)
            .AddTitle("Questionarios creados por mes")
            .DataBindTable(query, "Date")
            .Write();

        return null;
    }

但我收到以下错误:

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

2 个答案:

答案 0 :(得分:1)

我建议您在“简单”选择查询中获取所需内容,该查询将转到数据库,然后使用AsEnumerable在本地执行格式化以切换到进程内查询:

var query = TrialDB.Questionnaires
    .GroupBy(r => new {
        Month = r.DateCreated.Month,
        Year = r.DateCreated.Year,
    })
    .Select(group => new {
        group.Key.Year,
        group.Key.Month,
        Total = group.Count()
    })
    .AsEnumerable()
    .Select(x => x.Total, Date = string.Format("{0}/{1}", x.Year, x.Month))
    .ToList();

或者当它从数据库中拉回时将其保留为DateTime,正如Stuart建议的那样:

var query = TrialDB.Questionnaires
    .GroupBy(r => new {
        Month = r.DateCreated.Month,
        Year = r.DateCreated.Year,
    })
    .Select(group => new {
        Date = group.Key,
        Total = group.Count()
    })
    .AsEnumerable()
    .Select(x => x.Total,
                 Date = string.Format("{0}/{1}", x.Date.Year, x.Date.Month))
    .ToList();

有关AsEnumerable()的更多信息,请阅读我的Edulinq blog post on it

答案 1 :(得分:0)

我认为数据库本身不理解string.Format("{0}/{1}", group.Key.Year, group.Key.Month) - 因此您需要将信息作为DateTime撤回,然后在表示层中格式化日期。