C# SqlFunctions.DatePart:错误:函数必须是文本字符串
我试图使用C# SqlFunctions.DatePart:错误:函数必须是文本字符串,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我试图使用SqlFunctions.DatePart和一个字符串,我会根据参数进行更改,但是我似乎无法让它工作 我的代码: String dateArg = @"week"; var results = db.Orders .GroupBy(x => new { Completed = SqlFunctions.DatePart(@dateArg, x.Completed)
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参数必须是文本字符串
嗯,
@dateArg
不是一个文本字符串,就这么简单<代码>“一周”是
如果您需要改变日期部分的类型来分组,那么您需要将这些情况分开(“年”、“月”、“周”,我猜这些都是需要的)。这很笨拙,但这是将表达式树向下编译为查询操作方式的结果——就像在T-SQL本身中一样,DATEPART的第一个参数不能是参数(他们可能已经创建了单独的方法,
DatePartYear
,DatePartMonth
等等,这会使限制更加明显,你应该这样考虑调用)。好吧,@dateArg
不是一个文本字符串,就这么简单。“week”
就是这样
如果您需要更改日期部分的类型以分组,则需要将这些情况分开(“年”、“月”、“周”,我猜这些都是需要的)。这很笨拙,但这是将表达式树向下编译为查询操作方式的结果——就像在T-SQL本身中一样,DATEPART的第一个参数不能是参数(他们可能已经创建了单独的方法,
DatePartYear
,DatePartMonth
等等,这会使限制更加明显,您应该考虑这样的调用)。我知道这是一个老问题,但这可能会对某些人有所帮助。只需使用一个内联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));
我知道这是一个老生常谈的问题,但也许这会对某些人有所帮助。只需使用一个内联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));
异常不正是在告诉你到底出了什么问题吗?抱歉,这个纯素不受支持。异常不正是在告诉你到底出了什么问题吗?抱歉,这个纯素不受支持。
@dateArg
在C中引用名为dateArg
的变量是一种非常有效的方法。呸,我看到了@,并假设它是SQL语法。从来没有这样做过在C#中,我会修正我的回答。@dateArg
在C#中引用名为dateArg
的变量是一种非常有效的方法。呸,我看到了@,并假设它是SQL语法。在C#中,我从来没有这样做过。我会修正我的回答。你是什么意思?如果我添加一个额外的group by子句,它将不允许我,因为我有两个lin我指的是老式的复制粘贴:四个看起来非常相似的单独查询,只保留了一个传递给DatePart
的文本。如果您想知道:不,您不能将其拆分为单独的函数,因为这样您又会遇到原始问题。可以这样做无需复制粘贴代码,只需复制表达式树并替换字符串文本节点,但如果你问我,这会非常麻烦。你可以拆分“.Select”和“.ToList”至少是位。对于我的代码的可维护性来说,这似乎是一场噩梦。哦,好吧,如果这是最好的方法,那么我想这就是我的解决方案!谢谢。如果你限制这个查询(及其4个变体)对于它自己的方法,可维护性几乎不受影响,只是修改它的方便性稍差一些。当然,如果您在各种不同的查询中一直使用DATEPART
,那就是另一回事了。在这种情况下,我肯定会考虑使用GroupBy
作为自己的过滤器(返回IEnumerable
)您可以从其他地方重复使用。拆分案例是什么意思?如果我添加一个额外的group by子句,它将不允许我这样做,因为我有两行都试图按同一列进行分组。我指的是老式的复制粘贴:四个看起来非常相似的独立查询,只保留传递给DatePart
。如果您想知道:不,您不能将其拆分为单独的函数,因为这样您又会遇到原来的问题。可以不复制粘贴代码,通过复制表达式树并仅替换字符串文本节点来完成此操作,但如果您问我,这将非常麻烦。您可以拆分“.Select”和“.ToList”位。这似乎是我代码可维护性的噩梦。哦,好吧,如果这是最好的方法,那么我想这就是我的解决方案!谢谢。如果您限制此查询(及其4个变体)对于它自己的方法,可维护性几乎不受影响,只是修改它的方便性稍差一些。当然,如果您在各种不同的查询中一直使用,那就是另一回事了。在这种情况下,我肯定会考虑使用DATEPART
作为自己的过滤器(返回GroupBy
)可以从其他地方重复使用。IEnumerable