我正在使用WEB API并且让我困扰了一段时间。 我有以下linq查询:
var query = from booking in context.Bookings
select booking.Date;
我有这个查询返回一个日期。我想要的是将这个日期从YYYY - MM - DD转换为Week ...一年中哪一周与日期匹配。
var currCulture = CultureInfo.CurrentCulture;
var weekNo = currCulture.Calendar.GetWeekOfYear(
query,
currCulture.DateTimeFormat.CalendarWeekRule,
currCulture.DateTimeFormat.FirstDayOfWeek);
我知道这是错的,但我似乎无法找到办法解决这个问题......
答案 0 :(得分:0)
你在哪里错误?你的query
对象是什么类型的? IEnumerable
?如果是这样,那么在您调用.ToArray()
或.ToList()
或其他内容实际使查询生效之前,它不会被实例化。
var currCulture = CultureInfo.CurrentCulture;
var cal = currCulture.Calendar;
CalendarWeekRule myCWR = myCI.DateTimeFormat.CalendarWeekRule;
DayOfWeek myFirstDOW = myCI.DateTimeFormat.FirstDayOfWeek;
var results = (from booking in context.Bookings select booking.Date).ToArray()
.Select(p => new { Date = p, Week = cal.GetWeekOfYear(p, myCWR, myFirstDOW) })
.ToArray();
这是一个SWAG - 尚未对其进行测试 - 有关GetWeekOfYear
用法的详细信息,请参阅MSDN。关键是在操作日期之前执行.ToArray()
,否则您将尝试将该日期操作发送到您的数据库,并且它不会理解您的要求。< / p>
答案 1 :(得分:0)
假设context
是EF数据库上下文而RDBMS是Sql Server,那么您可以尝试(未测试):
var weekNumbers = from booking in context.Booking
select SqlFunctions.DatePart("wk", booking.Date);
如果它有效,它应该在Sql server上从日期开始提取一周。
答案 2 :(得分:0)
就我而言,它可以做到:
var query = from booking in context.Bookings
select booking.Date.weekOfYear();
我将在扩展类中定义weekOfYear()方法:
public static class dateExtensions
{
public static int weekOfYear(this DateTime d)
{
return CultureInfo.InvariantCulture.Calendar.GetWeekOfYear(d, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
}
}
有关精确计算周数的详细信息,我建议您阅读以下答案: Get the correct week number of a given date