我正在尝试从数据库中获取条目,其中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);
}
有谁知道如何解决这个问题?
答案 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