2009-08-16 70 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);