C# LINQ to实体无法识别该方法

C# LINQ to实体无法识别该方法,c#,.net,entity-framework,C#,.net,Entity Framework,我对Linq to实体有一个问题,无法找到解决方法 这是我的代码: var queryResult = result.Where(x => x.FollowedUp.Value.GetWeekFromDateTime() == DateTime.Now.GetWeekFromDateTime()).Select(x => x); 我的扩展方法是: public static int GetWeekFromDateTime(this DateTime date)

我对Linq to实体有一个问题,无法找到解决方法

这是我的代码:

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”的定义不存在。但是我该怎么做呢?我想将我从数据库中获得的weeknumber from date与此weeknumber进行比较


谢谢大家!

如果您在
FollowedUp
字段上有一个合适的索引,您可能希望在这里调整您的算法,以通过C#计算当前星期的最小和最大日期,并以
value>=Min&&value的形式进行查询。Linq to Entities当前不支持特定于区域性的查询功能。有关更多详细信息,请参阅上的已接受答案。我相信您必须将整个结果集拉回到一个非L2E集合中,然后您可以使用
GetWeekFromDateTime
方法对其进行过滤。

您必须将所有记录作为数组或列表检索到客户端,然后使用查询对其进行过滤,就像您在数组上所显示的那样(而不是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

嗯,FollowedUp字段没有索引。它是DateTime字段您正在搜索的字段应该有适当的索引,也是。否则,您正在进行表扫描。除非这是一个非常小的表,否则最好在
FollowedUp
字段上设置索引,至少对于我推荐的特定查询是这样。我甚至没有从这个角度考虑过它;+1我认为他最好只获取一周中的最小/最大天数,然后查询索引d
followdup
字段,用于这些范围内的值。我认为您有一个更完整的答案(+1),但我想确定OP对L2E抛出错误的原因有所了解。你的意思是我应该获取所有信息,然后用它过滤第一个集合?嗯,试图弄清楚如何…这正是我想做的,但在Linq to Entities中:(这与Linq to实体有何不同或不兼容?使用此查询与Linq to实体是否仍会出错?