LINQ to Entities无法识别该方法

时间:2010-12-27 13:27:55

标签: c# .net entity-framework

我遇到了Linq to Entities的问题,我无法找到解决方法。

这是我的代码:

var queryResult = result.Where(x => x.FollowedUp.Value.GetWeekFromDateTime() 
    ==  DateTime.Now.GetWeekFromDateTime()).Select(x => x);

我的扩展方法是:

    public static int GetWeekFromDateTime(this DateTime date)
    {
        return System.Threading.Thread.CurrentThread.CurrentCulture.Calendar.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    }

问题:

我得到“LINQ to Entities无法识别方法GetWeekFromDateTime”,我理解为什么因为它试图将我的代码转换为sql代码并且“GetWeekFromDateTime”不存在。但是我该怎么办呢?我想比较从数据库到本周数据的日期的周数。

谢谢!

3 个答案:

答案 0 :(得分:7)

如果你在FollowedUp字段上有一个不错的索引,你可能想在这里调整你的算法,而只是通过C#计算当前周的最小和最大日期,并将你的查询作为一个而是value >= min && value <= max。这样,您就不会对数据库的每一行进行计算。


但是要更直接地回答你的问题,即使我不建议在你的特定情况下这样做:你可以创建一个SQL函数,它在这里进行计算,将它导入你的数据上下文,并在里面调用它相反,你的查询。

这将导致每一行都通过该功能,请记住。而且,即使您仍然希望以这种方式进行,您也应该改变获得本周的方式;你只需要获得一次该值,并在查询中使用一个变量...不需要尝试为每一行重新计算它。

答案 1 :(得分:1)

Linq-to-Entities目前不支持特定于文化的查询功能。有关详细信息,请参阅this question上接受的答案。我相信您必须将整个结果集撤回到非L2E集合中,然后您可以使用GetWeekFromDateTime方法进行过滤。

答案 2 :(得分:0)

您要么必须将所有记录作为数组或列表检索到客户端,然后使用您已经显示在阵列上运行的查询(而不是onver LINQ to SQL)来过滤它们,或者您必须将其转换为LINQ to SQL可以理解的语法:

        int thisWeek = (DateTime.Now.DayOfYear + (int)(new DateTime(DateTime.Now.Year, 1, 1).DayOfWeek)) / 7;
        var queryResult =
            (from row in result
             let WeekNum = (row.FollowedUp.Value.DayOfYear +
            (int)(new DateTime(row.FollowedUp.Value.Year, 1, 1).DayOfWeek)) / 7
             where WeekNum == thisWeek
             select row);

LINQ to SQL实际上足够聪明,可以将WeekNum表达式转换为SQL代码,如下所示:

(DATEPART(DayOfYear, [t0].[FollowedUp]) + 
(CONVERT(Int,(DATEPART(dw, CONVERT(DATETIME, CONVERT(NCHAR(2), 1) + 
('/' + (CONVERT(NCHAR(2), 1) + ('/' + CONVERT(NCHAR(4), 
DATEPART(Year, [t0].[FollowedUp]))))), 101)) + 
(@@DATEFIRST) + 6) % 7))) / 7