2009-08-16 15 views
0

私はデータベースから日付の週を取得し、DateTimePickerからユーザーが選択した値と比較しようとしています。私のユーザーは1日を選択することができ、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

SQLするには、このLINQですか? – shahkalpesh

+0

誰かが[ブログ投稿](http://blog.benhall.me.uk/2008/01/datepartweek-with-linq-to-sql.html)を持っているように見えます。 –

答えて

1

ilkはどうなっていますか?

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); 

希望、

ダン

おそらくあなたの新しいDateExクラスにMath.Truncate(date.DayOfYear/7)を取る

+0

うるう年12月31日のチェックが必要です。 –

+0

ありがとうございました。これはトリックでした。私は閏年を犯すことを確認する必要がありますが、それは完全に機能しました。ありがとうございました。 – yveslebeau

1

あなたが必要とするものを正確に行うC#メソッドを書くことができます。 LINQに関する素晴らしい点の1つは、クエリを書くときにどのように完全なプログラミング言語のツールを利用できるかということです。

は "isoweeknumberのC#の" のための迅速なGoogle検索は、これを回し:

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

私は、System.Globalization名前空間にあるCalendar.GetWeekOfYearを使用。

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); 
関連する問題