MVC LINQ从datetime转换为week

时间:2016-08-11 20:43:37

标签: asp.net-mvc linq

我正在使用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);

我知道这是错的,但我似乎无法找到办法解决这个问题......

3 个答案:

答案 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