2016-04-26 17 views
1

だから、BasketにはBasketItemsが含まれています。このアイテムのそれぞれはMenuDateです。今度はOrdersを作成して、条件が次のようになります。すべてOrderには1週間分のアイテム(ここには月曜日から始まります)が必要です。LINQ - オブジェクトのリストを(DateTimeの昇順で)並べ替えるクエリをサブタイトル

私はすべての日付と毎週月曜日にチェックされる複数のforeach-constructsを作成することができます(真実)でも、これはすべてちょっとハッキリしているようです。最適な、それは私が書いた何とかこのコードのようにLINQ-クエリを持っている、だろうが、これは戻って期待値を与えるものではありません:

startofweekは私の前の月曜日を与え、私が使用extensionmethodある
var basketItems = currBasket.Items.OrderBy(y => y.MenuDate).ToList(); 
      if (basketItems.Count() > 0) 
      { 
       List<List<BasketDay>> listOfItemsPerWeek = basketItems 
       .GroupBy(p => p.MenuDate >= basketItems.First().MenuDate.StartOfWeek(DayOfWeek.Monday) 
          && p.MenuDate < basketItems.First().MenuDate.StartOfWeek(DayOfWeek.Monday).AddDays(7)) 
       .Select(g => g.ToList()) 
       .ToList(); 
      } 

を与えられた日時(または月曜日は確かに月曜日)。

には、mondayとsunday(23:59:59)の間にMenuDateがあるcurrBasket.Itemsのすべてのメニューが含まれています。

私はこれまでのことをすべて試しましたが、今はアイデアがなくなり、あなたが私をここで助けてくれることを願っています。

Besteが

編集について:

それを明確にするが、我々はここで食品BRANCHEにいると仮定します。BasketDayその日のメニューが含まれています。

ここで(ここではそのことは重要ではないため削除年)の例のユースケースがあります: お客様1月に次の日付のためのバスケットにメニューを追加します。

月曜日01.01、 水曜日03.01。 金曜日05.01。
日曜日07.01。 月曜日08.01。 火曜日09.01。

彼のバスケットには6個のアイテムが含まれています。

私が必要としているのは、この1つのリストをBasketDay個のインスタンスを毎週List<BasketDay>に分けることです。

上記のLINQクエリは、私にとってこれを行う必要があります。その後、私はこのような別個の注文オブジェクトを作成することができ:(。。01.01 - 07..01)、4つの項目を有するものが含ま

foreach(weekOrder in listOfItemsPerWeek){...} 

場所と2つのアイテム(08.01を有する第二および。 09.01。)

希望これはより明確になります。

+2

'BasketDay'はあなたが話している「注文」ですか?あなたが何を望んでいるかははっきりしていません。グループの希望するキーは何ですか? LINQはコードを読みやすくするために役立たないことがあります。 –

答えて

2

group byに使用できる一時変数を宣言することをおすすめします。カレンダー週はここでは良い選択かもしれません。

var calendar = CultureInfo.CurrentCulture.Calendar; 

var items = (from item in basketItems 
      let calendarWeek = calendar.GetWeekOfYear(item.MenuDate, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday) 
      group item by calendarWeek into baskets 
      select baskets); 

編集:CalendarWeekRuleは、年の最初の週がどのように決定されるかを選択します。これは文化と文化が異なり、私はドイツでここで使用されているISO definitionを選んだ。月曜日から日曜日までのグループ分けだけに興味があるので、絶対値はあなたと無関係かもしれないので、好きなルールを選ぶことができます。あなたがラムダを好む場合のコードは次のようになります。

var calendar = CultureInfo.CurrentCulture.Calendar; 

var items = basketItems.GroupBy(i => calendar.GetWeekOfYear(i.MenuDate, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)); 
+0

このソリューションをありがとうございます。しかし、2つの質問:1)私は質問でやったように、これはラムダとして可能ですか?私は 'let'を使って検索しましたが、何かを見つけられませんでした。 2)「CalendarWeekRule.FirstFourDayWeek」がこの文脈で何をしているか説明してください。私にはいくぶん不明です。 –

0

あなたは今年の週に、あなたができるだけでグループに各項目の年間(週数)の週を計算する必要があります。ここで私はそれを行う方法です、私はまた、私は複数の年の日付範囲を持っていると仮定しているので、グループ化は年と週の番号になります、私はあなたが好きなら月曜日に週の開始を設定しました

public class Item 
{ 
    public string Name { get; set; } 
    public DateTime ItemDate { get; set; } 
} 
public class ItemWithWeekInfo 
{ 
    public int Year { get; set; } 

    public int WeekOfTheYear { get; set; } 

    public Item Item { get; set; } 
} 

public class Order 
{ 
    public int Year { get; set; } 
    public int WeekOfTheYear { get; set; } 
    public List<Item> Items { get; set; } 
} 

DateTimeFormatInfo dfi = DateTimeFormatInfo.CurrentInfo; 
Calendar cal = dfi.Calendar; 
var groups = items.Select(p => new ItemWithWeekInfo 
     { 
      Year = p.ItemDate.Year, 
      WeekOfTheYear = cal.GetWeekOfYear(p.ItemDate, dfi.CalendarWeekRule, DayOfWeek.Monday), 
      Item = p 
     }).GroupBy(p => new { p.Year , p.WeekOfTheYear}).Select(p=>new Order 
     { 
      Year = p.Key.Year, 
      WeekOfTheYear = p.Key.WeekOfTheYear, 
      Items = p.Select(x=> x.Item).ToList() 
     }).ToList(); 

これは既にリストがある場合には機能しますが、データベース呼び出しを行う場合はこれを行うことができません。データベースサポート機能を使用して年番号と週番号を計算する必要があります。

関連する問題