2016-03-18 21 views
4

私はMVC 5/EF 6で働いています。私は複数の人のためのカレンダーを表示するビューを作成しようとしています。結果をグループ化し、結果をグループ化し、グループ化された結果で空でもすべての日付を表示します。

私は既に人によってグループ分けされたビューを持っており、検索範囲内のすべての日付のリストを表示します。しかし、もしその人がその日に予定されていることを何も持っていなければ、日付はその人の下に掲載されていません。

今のところ、何もスケジュールされていない空の日付は、「空の」人物グループの下にグループ化されています。

私の現在の結果:

Person: 
------------------------------- 
04/01/16 (blank) 
04/02/16 (blank) 
04/03/16 (blank) 

Person: Jane 
------------------------------- 
04/04/2016: To Do Item 
04/05/2016: To Do Item 

Person: John 
------------------------------- 
04/04/2016: To Do Item 
04/05/2016: To Do Item 

は、どのように私はこの結果を得ることができますか?クエリは私が何とかDATERANGEリスト内のすべての日付に関連付けられている人の名前を取得する必要があることを理解

var activecal = db.Calendar.Where(x => (x.CalDate >= startdate && x.CalDate <= enddate).ToList(); 


// merge calendar with date range in search selected 

var calendar = (from d in dateRange //dateRange = date range search 
        join c in activecal.ToList() on d equals c.CalDate into joinedResult 
        from r in joinedResult.DefaultIfEmpty() 
        select new CalVM 
        { 
         FullName = r == null ? null : r.FullName, 
         CalLocation = r == null ? null : r.CalLocation, 
         calDay = d.Date,     
        }).ToList(); 

ビュー

@{ 
     foreach (var group in Model.GroupBy(a => a.FullName)) 
     { 
      <h3>Person: @group.Key</h3> 
      <div class="table-responsive"> 
       <table class="table table-hover small"> 
        <tr> 
         <th> 
          Cal Day 
         </th> 
         <th> 
          Location 
         </th> 
        </tr> 
        @foreach (var i in group) 
        { 
         <tr> 
          <td> 
           @Html.DisplayFor(modelItem => i.calDay) 
          </td> 
          <td> 
           @Html.DisplayFor(modelItem => i.CalLocation) 
          </td>       
         </tr> 
        } 
       </table> 
      </div> 
     } 
    } 

を表示するために戻っ

Person: Jane 
------------------------------- 
04/01/16 (blank) 
04/02/16 (blank) 
04/03/16 (blank) 
04/04/2016: To Do Item 
04/05/2016: To Do Item 

Person: John 
------------------------------- 
04/01/16 (blank) 
04/02/16 (blank) 
04/03/16 (blank) 
04/04/2016: To Do Item 
04/05/2016: To Do Item 

、私はちょうど午前どのようにそれを行うか分からない。日付範囲リストの唯一のパラメータは日付なので、参加するものはありません。

答えて

1

あなたはその人をグループにしてから、あなたの範囲の各日付について、その日の日付とスケジュールされたイベント(私はそれをToDoと名付けました)を保持します。そして、あなたは日付ごとに複数のToDoを持つことができると思います。

例:

var dateRange = GetDateRange(new DateTime(2016, 1, 1), new DateTime(2016, 1, 5)).ToList(); 

var todos = new List<ToDo> 
{ 
    new ToDo { Date = new DateTime(2016,1,3), Person = "John", What = "Do that"}, 
    new ToDo { Date = new DateTime(2016,1,4), Person = "John", What = "Do this"}, 
    new ToDo { Date = new DateTime(2016,1,4), Person = "John", What = "Do nothing"}, 

    new ToDo { Date = new DateTime(2016,1,2), Person = "Jane",What = "Do something"}, 
    new ToDo { Date = new DateTime(2016,1,3), Person = "Jane", What = "Do whatever"} 
}; 

var personToDos = todos.GroupBy(x => x.Person) 
    .ToDictionary(key => key.Key, value => dateRange.Select(date => new ToDosPerDate 
    { 
     Date = date, 
     ToDos = value.Where(a => a.Date == date) 
    })); 

foreach (var item in personToDos) 
{ 
    Console.WriteLine(item.Key); 
    Console.WriteLine("---------------"); 
    foreach (var model in item.Value) 
    { 
     Console.Write(model.Date + " "); 
     Console.WriteLine(string.Join(", ", model.ToDos)); 
    } 
    Console.WriteLine(); 
} 

や他のもの:

public class ToDo 
{ 
    public DateTime Date { get; set; } 

    public string Person { get; set; } 

    public string What { get; set; } 

    public override string ToString() 
    { 
     return What; 
    } 
} 

public class ToDosPerDate 
{ 
    public DateTime Date { get; set; } 

    public IEnumerable<ToDo> ToDos { get; set; } 
} 

// From: http://stackoverflow.com/questions/3738748/create-an-array-or-list-of-all-dates-between-two-dates 
public static IEnumerable<DateTime> GetDateRange(DateTime startDate, DateTime endDate) 
{ 
    if (endDate < startDate) 
     throw new ArgumentException("endDate must be greater than or equal to startDate"); 

    while (startDate <= endDate) 
    { 
     yield return startDate; 
     startDate = startDate.AddDays(1); 
    } 
} 

上記のコードの出力である:MVCかみそりビューで出力personToDos

John 
--------------- 
2016-01-01 12:00:00 AM 
2016-01-02 12:00:00 AM 
2016-01-03 12:00:00 AM Do that 
2016-01-04 12:00:00 AM Do this, Do nothing 
2016-01-05 12:00:00 AM 

Jane 
--------------- 
2016-01-01 12:00:00 AM 
2016-01-02 12:00:00 AM Do something 
2016-01-03 12:00:00 AM Do whatever 
2016-01-04 12:00:00 AM 
2016-01-05 12:00:00 AM 

サンプル:

@model Dictionary<string, IEnumerable<ToDosPerDate>> 
... 
@foreach (var person in Model) 
{ 
    <h3>@person.Key</h3> 

    foreach (var d in person.Value) 
    { 
     <div>Date: @d.Date</div> 

     foreach (var todo in d.ToDos) 
     { 
      <div>@todo.What</div> 
     } 
    } 
} 
+0

ありがとうございます。ビューのコードを追加できますか?これを別のビューモデルに渡すか、personToDos.ToList()を返す必要がありますか? – Daniela

+0

_personToDos_は 'Dictionary > '型です。モデルとしてビューに直接戻すことも、他のデータを含むビュー・モデルに配置することもできます。私は私の答えにサンプルの剃刀のビューを追加しました – Chris

+0

私は実際には辞書オブジェクトをよく理解していませんが、それは動作しています!私はそれをよく理解するために、その話題を読まなければならないでしょう。再度、感謝します! – Daniela

関連する問題