2017-11-14 9 views
0

.Net MVCを使用しています。私はDB Firstアプローチを使用しています。私はスクールデイプログラムが必要ですが、私はピボット、DataTableまたは何か他のものを使うのはどうですか?テーブルから行列を作成する#

SQLの表は、そのようなものです:

WeeklyProgram 
Id RoomId Hour Day 
1 1  9 1 
2 1  12 1 
3 2  14 1 
4 2  12 2 
5 3  11 1 
6 4  10 2 

そして、このようなヌル細胞とHTMLのテーブルに変換しようとしている:

For Day 1 My School Program is; 
#  Room1 Room2 Room3 
9:00 1  null null 
10:00 null null null 
11:00 null null 5 
12:00 2  null null 
13:00 null null null 
14:00 null 3  null 

pivoting試みたが、カントは、私が考えたものを手に入れます。

ありがとうございます。

UPDATE:私はANSWER

if (!date.HasValue) 
      date = DateTime.Now; 

     List<WeeklyProgram> modelBase = table 
      .Where(b => b.Day == day) 
      .ToList(); 

     int[] hours = { 9, 10, 11, 12, 13, 14}; 

     List<PivotTable> pivotTable = new List<PivotTable>(); 

     foreach (var hour in hours) 
     { 
      PivotTable pivotRow = new PivotTable() { Hour = hour }; 

      foreach (var item in modelBase) 
       if (item.Hour == hour) 
        switch (item.RoomId) 
        { 
         case 1: 
          pivotRow.Room1 = item.Id; 
          break; 
         case 2: 
          pivotRow.Room2 = item.Id; 
          break; 
         case 3: 
          pivotRow.Room3 = item.Id; 
          break; 
        } 
      pivotTable.Add(pivotRow); 
     } 

     return pivotTable; 

見つけた -

public class PivotTable 
{ 
    public int Hour { get; set; } 
    public int Room1 { get; set; } 
    public int Room2 { get; set; } 
    public int Room3 { get; set; } 
    public int Room4 { get; set; } 
    public int Room5 { get; set; } 
} 

答えて

0

まず、あなたが興味の日までのごWeeklyProgramをフィルタリングする必要があります。

var dayProgram = from c in WeeklyProgram 
       where c.Day == 1 
       select c; 

次に、そのデータから1時間単位のスケジュール行を抽出することができます

var dayClasses = (from c in dayProgram 
        group c by c.Hour into cg 
        let cgd = cg.ToDictionary(c => c.RoomId, c => (int?)c.Id) 
        select new { 
         Hour = cg.Key, 
         Room1 = cgd.GetValueOrDefault(1), 
         Room2 = cgd.GetValueOrDefault(2), 
         Room3 = cgd.GetValueOrDefault(3) 
        }).ToDictionary(c => c.Hour, c => c); 

を今、あなたはWeeklyProgram中に使用されているすべての時間抽出します:

var hoursInWeek = (from c in WeeklyProgram 
        orderby c.Hour 
        select c.Hour).Distinct(); 
を、後の検索のために Dictionaryに変換する、null許容型に Idを変換することにより、予定外の部屋のためにヌルをAVING

今、あなたは予定の部屋で使用する時間を結合する準備ができている:

var ans = from h in hoursInWeek 
      select new { 
       Hour = $"{h}:00", 
       Room1 = dayClasses.GetValueOrDefault(h)?.Room1, 
       Room2 = dayClasses.GetValueOrDefault(h)?.Room2, 
       Room3 = dayClasses.GetValueOrDefault(h)?.Room3 
      }; 

これはにヘルパー関数を使用しています(注:これはC#7.1までの特徴のすべてを使用しています)キーが簡単に存在しない可能性があります辞書で調べる行います

static public class Ext { 
    public static TV GetValueOrDefault<TK, TV>(this IDictionary<TK, TV> dict, TK key, TV defaultValue = default(TV)) => dict.TryGetValue(key, out TV value) ? value : defaultValue; 
} 
+0

のC#の以前のバージョンでは、このバージョンを使用することができますGetValueorDefaultはエラーを返します。 https://framapic.org/ZrIXNfT9SYVR/I4TCKpXDxdyy.png –

+0

あなたの写真は表示されません。あなたのホストはプロキシの背後で動作していません。 C#7.0を使用している場合、 'default'を' default(TV) 'で置き換えます。 – NetMage

関連する問題