仅从DB匹配当前周的条目

时间:2015-08-13 08:52:50

标签: c# sql linq entity-framework

我正在尝试从数据库中获取条目,其中table.Date.WeekDayThing = DateTime.Now.WeekDayThing(请参阅下面的方法),但我收到错误

  

LINQ to Entities无法识别方法'Int32   GetIso8601WeekOfYear(System.DateTime)'方法,而这个方法不行   被翻译成商店表达。

LINQ查询

var dbHours = DAO.Instance.HourRegistration
    .Where(x => x.Login_ID == logId && x.Cust_ID == custId && GetIso8601WeekOfYear(x.Date) == GetIso8601WeekOfYear(DateTime.Now))
    .Include(x => x.Customer)
    .ToList();

方法GetIso8601WeekOfYear(日期时间)

public int GetIso8601WeekOfYear(DateTime time)
    {
        // Seriously cheat.  If its Monday, Tuesday or Wednesday, then it'll 
        // be the same week# as whatever Thursday, Friday or Saturday are,
        // and we always get those right
        DayOfWeek day = CultureInfo.InvariantCulture.Calendar.GetDayOfWeek(time);
        if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
        {
            time = time.AddDays(3);
        }

        // Return the week of our adjusted day
        return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
    } 

有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

一种选择是获取数据,然后应用周过滤器:

var dbHours = DAO.Instance.HourRegistration
    .Where(x => x.Login_ID == logId && x.Cust_ID == custId)
    .Include(x => x.Customer)
    .ToList()
    .Where(x => GetIso8601WeekOfYear(x.Date) == GetIso8601WeekOfYear(DateTime.Now));

如果您认为这会带来太多结果,您可以过滤例如仅返回最后7天的数据,这将保证当前周数。

另一个选择是将您的函数重写为EntityFunctions,如下所述:LINQ to Entities: Age calculation in a LINQ query causes "Method cannot be translated into a store expression"

答案 1 :(得分:0)

在LINQ for EF中,您只能使用支持的规范函数(所有ef提供程序应该支持的函数)或提供程序支持的函数(SQL Server)。

在这种情况下,您有两种不同的方法:您可以编写存储过程来解决所有查询,然后将其映射到EF,或者您可以仅使用支持的函数来爆炸查询。

DateTime规范函数:https://msdn.microsoft.com/en-us/library/vstudio/bb738563(v=vs.100).aspx

SQL Server EF提供程序函数:https://msdn.microsoft.com/en-us/library/vstudio/bb399545(v=vs.100).aspx

在您的情况下,正确的功能是DatePart(与一些检查混合)。

修改

总是有“早期”实现查询的解决方案(早期放置ToList然后在内存中工作),但这意味着您获取的数据超出了您的需要。

<强> EDIT2

SQL Server DATEPART已经有了使用ISO标准获得本周的方法。你的LINQ查询应该是这个(但我没试过)。

.Where(x => x.Login_ID == logId && x.Cust_ID == custId && SqlFunctions.DatePart("ISO_WEEK", x.Date) == SqlFunctions.DatePart(DateTime.Now))

参考是上面的链接和https://msdn.microsoft.com/en-us/library/ms174420.aspx