Linq to Entities SqlFunctions.DatePart

4

这段代码出现了错误:

void GetLog()
{
    List<CAR_STATUS_LOGS> logs = null;
    using (TESTEntities ctx = new TESTEntities())
    {
        logs = 
            ctx.CAR_STATUS_LOGS
                .Where(a => SqlFunctions.DatePart("DAY", a.TIMEMARK) == 1)
                .ToList();
    }
}

错误如下:
LINQ to Entities不识别方法“System.Nullable`1[System.Int32] DatePart(System.String,System.Nullable`1[System.DateTime])”,此方法无法转换为存储表达式。
我无法看出在SqlFunctions.DatePart上出了什么问题。TIMEMARK列是Sqlserver DateTime类型。有任何想法吗?

这是一个运行时错误,不是编译时错误,对吗? - Raphaël Althaus
是的,这是一个运行时错误,编译正常。 - Paul
你可以看一下这个结果,如果你使用 .Select(a => SqlFunctions.DatePart("day", a.TIMEMARK)).ToList() 替换了原来的 .Where(a => a.TIMEMARK.Day == DateTime.Now.Day) 的话。 - Raphaël Althaus
SqlServer 2008 r2和.net4.5和EF 6 - Paul
1
@RaphaëlAlthaus,TIMEMARK的空值检查有什么用处?我的意思是,在datepart中第二个参数是可为空的。 - Neel
显示剩余2条评论
4个回答

15
你可以使用来自 EntityFramework.SqlServer.dll (Entity Framework 6.1.3) 的 System.Data.Entity.SqlServer.SqlFunctions,例如:
myTable.Where (w => 
    (System.Data.Entity.SqlServer.SqlFunctions.DatePart("weekday", w.Data).Value == 1);

1
这个答案中最好的部分是System.Data.Entity.SqlServer,其他文档提到了System.Data.Object.SqlClients,虽然可以编译但会抛出错误。 - Bruce C
我不得不使用以下代码:BeginDate = SqlFunctions.StringConvert((double)proj.Dt_ProjApply_Begin.Value.Month) + "/" + SqlFunctions.DateName("dd", proj.Dt_ProjApply_Begin) + "/" + SqlFunctions.DateName("yyyy", proj.Dt_ProjApply_Begin) 来获取1/1/2001。但是我需要在顶部使用 using System.Data.Objects.SqlClient; 来使用SqlFunctions。 - Kristopher

0
DbFunctions.DiffDays(Date1,Date2)==1

-1

那也无法运行。 - Paul

-1
如果a.TIMEMARK是一个日期时间,你可以通过a.TIMEMARK.Day访问它的日期。

抱歉,这听起来没有意义。请参考 MSDN 上的 SqlFunctions:提供在 LINQ to Entities 查询中调用数据库函数的公共语言运行时 (CLR) 方法。:http://msdn.microsoft.com/en-us/library/system.data.objects.sqlclient.sqlfunctions(v=vs.110).aspx - Raphaël Althaus
我更愿意说,TestEntities是一个“模拟”的上下文,或者类似于这样的东西,而不是与数据库相关(但是,错误消息并不清楚)。 - Raphaël Althaus
抱歉,我的答案不准确。 这在一定程度上是由于提供程序。 例如,Oracle.ManagedDataAccess提供程序到目前为止并不支持我尝试的所有方式。 - Julian Cr
2
答案不正确,请参见命名空间System.Data.Entity.SqlServer.SqlFunctions以下。 - Alexandre
由于Linq to Entities在命名空间System.Data.Entity.SqlServer中支持SqlFunctions,因此标记下降。 - Luke T O'Brien
这显然是一个糟糕的答案。请至少纠正它或参考@Alexandre的答案。 - David

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接