2009-08-16 26 views
0

我想从数据库中获取一个日期的一周,并将它与DateTimePicker中用户选择的值进行比较。我的用户可以选择一天,然后我写了一个类,以1到52的形式给出了当天的那一周。我试图选择让LINQ将给定日期的数周与数据库中选定的周进行比较用户。例如:从linq查询获取日期的一周

var report = (from orders in Context.Orders 
       where DateEx.ISOWeekNumber(orders.Date) == 
        DateEx.ISOWeekNumber(datepicker1.Value) 
       select orders); 

但它不工作,因为LINQ没有翻译ISOWeekNumber。 任何人都知道我该怎么做?

+0

这是LINQ to SQL的? – shahkalpesh 2009-08-16 19:55:49

+0

看起来有人有[博客文章](http://blog.benhall.me.uk/2008/01/datepartweek-with-linq-to-sql.html)谈论这样做几种不同的方式。 – 2009-08-16 20:13:46

回答

1

这样的事情呢?

Math.Truncate(date.DayOfYear/7) +1 

给你:

var report = (from orders in Context.Orders 
    where Math.Truncate(orders.Date.DayOfYear/7) + 1 == 
    Math.Truncate(datepicker1.Value.DayOfYear/7) + 1 
    select orders); 

希望帮助,

大概需要Math.Truncate(date.DayOfYear/7)到您的新DateEx类

+0

您需要在闰年检查12月31日! – 2009-08-16 20:07:16

+0

非常感谢。这个伎俩。我只需要确保我抓住了闰年,但它完美运作。再次感谢你。 – yveslebeau 2009-08-17 13:34:48

1

您可以编写一个完全符合您需要的C#方法。 LINQ的好处之一就是在编写查询时,如何使用完整编程语言的所有工具。

快速谷歌搜索 “isoweeknumber C#” 变成了这样:

private int weekNumber(DateTime fromDate) 
{ 
    // Get jan 1st of the year 
    DateTime startOfYear = fromDate.AddDays(- fromDate.Day + 1).AddMonths(- fromDate.Month +1); 
    // Get dec 31st of the year 
    DateTime endOfYear = startOfYear.AddYears(1).AddDays(-1); 
    // ISO 8601 weeks start with Monday 
    // The first week of a year includes the first Thursday 
    // DayOfWeek returns 0 for sunday up to 6 for saterday 
    int[] iso8601Correction = {6,7,8,9,10,4,5}; 
    int nds = fromDate.Subtract(startOfYear).Days + iso8601Correction[(int)startOfYear.DayOfWeek]; 
    int wk = nds/7; 
    switch(wk) 
    { 
     case 0 : 
      // Return weeknumber of dec 31st of the previous year 
      return weekNumber(startOfYear.AddDays(-1)); 
     case 53 : 
      // If dec 31st falls before thursday it is week 01 of next year 
      if (endOfYear.DayOfWeek < DayOfWeek.Thursday) 
       return 1; 
      else 
       return wk; 
     default : return wk; 
    } 
} 

来源:http://codebetter.com/blogs/peter.van.ooijen/archive/2005/09/26/132466.aspx

0

我用Calendar.GetWeekOfYear这是System.Globalization命名空间中。

MSDN Link

 DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo; 
     DateTime specifiedDate = DateTime.Now; 
     Calendar cal = dfi.Calendar; 
     int weekNo = cal.GetWeekOfYear(specifiedDate, dfi.CalendarWeekRule, dfi.FirstDayOfWeek); 
     var dataForWeek = data.Where(x => cal.GetWeekOfYear(x.DeliveryDate.Value, dfi.CalendarWeekRule, dfi.FirstDayOfWeek) == weekNo);