SqlFunctions.DatePart:错误:函数必须是文字字符串

时间:2014-10-13 17:38:12

标签: c# sql-server entity-framework

我正在尝试将SqlFunctions.DatePart与我根据参数更改的字符串一起使用,但我似乎无法让它工作。

我的代码:

String dateArg = @"week";

var results = db.Orders
                .GroupBy(x => new
                {
                    Completed = SqlFunctions.DatePart(@dateArg, x.Completed)
                })
                .Select(x=>x.Sum(y => y.Total))
                .ToList();

失败,出现以下错误:

  

' SqlServer.DATEPART'的DATEPART参数。函数必须是文字字符串。

3 个答案:

答案 0 :(得分:3)

嗯,@dateArg不是文字字符串,就像那样简单。但"week"是。{/ p>

如果您需要更改DATEPART的分组类型,您需要将案例分开(“年”,“月”,“周”,我猜这些就是这些需要)。这是笨拙的,但它是将表达式树编译为查询操作的方式的结果 - 就像在T-SQL本身中一样,DATEPART的第一个参数不能是参数(它们也可能创建了单独的方法{{ 1}},DatePartYear等等,这会使限制更加明显,你应该想到这样的调用。)

答案 1 :(得分:1)

我知道这是一个老问题,但也许这会对某人有所帮助。只需使用内联if语句,如下所示:

string datePart = "week";
var results = db.Table.GroupBy(item => 
    (datePart == "quarter") ? SqlFunctions.DatePart("quarter", item.Date) :
    (datePart == "month") ? SqlFunctions.DatePart("month", item.Date) :
    SqlFunctions.DatePart("week", item.Date));

答案 2 :(得分:0)

var results = db.Orders
            .GroupBy(x => new
            {
                Completed = SqlFunctions.DatePart("week", x.Completed)
            })
            .Select(x=>x.Sum(y => y.Total))
            .ToList();