Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SqlFunctions.DatePart:错误:函数必须是文本字符串_C#_Sql Server_Entity Framework - Fatal编程技术网

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
)可以从其他地方重复使用。