2010-12-17 6 views
0

私はリストプロパティを含むエンティティオブジェクトを持っています。リストの値を右側に拡大したいと思います。 LINQに新しいので、私はこれを行う方法がわかりません。強くオブジェクトをタイプすることもできますが、コンパイル時にカウント/値を知る必要があり、より動的にしたいと考えています。リストプロパティのLinq "reporting"質問

私が望んだの出力のようなものです:


名前                                    DEMO1         DEMO2       Demo3
者名1           TX                     TX
人Name2は          TX                                                 OK
人NAME3           TX                     TX                     OK


Main Class

public Main() 
{ 
    List<Event> events = new List<Event>(); 
    events.Add(new Event() 
    { 
     EventDate = DateTime.Now, 
     EventLocation = new Location() { State = "TX" }, 
     EventName = "Demo1" 
    }); 
    events.Add(new Event() 
    { 
     EventDate = DateTime.Now, 
     EventLocation = events[0].EventLocation, 
     EventName = "Demo2" 
    }); 
    events.Add(new Event() 
    { 
     EventDate = DateTime.Now, 
     EventLocation = new Location() { State = "OK" }, 
     EventName = "Demo3" 
    }); 

    List<Person> people = new List<Person>(); 

    Person person1 = new Person(); 
    person1.Name = "Person Name1"; 
    person1.Events.Add(events[0]); 
    person1.Events.Add(events[1]); 

    Person person2 = new Person(); 
    person2.Name = "Person Name2"; 
    person2.Events.Add(events[0]); 
    person2.Events.Add(events[2]); 

    Person person3 = new Person(); 
    person3.Name = "Person Name3"; 
    person3.Events.Add(events[0]); 
    person3.Events.Add(events[1]); 
    person3.Events.Add(events[2]); 
    people.Add(person1); 
    people.Add(person2); 
    people.Add(person3); 
} 

答えて

0

それはあなたがメモリ内またはdatabseでクエリを実行するかどうかに依存します。いずれにしても、匿名型のメンバーを動的に生成することはできないため、結果の「動的な」部分を持つリストを返す必要があります。メモリで

(あなたの例のように)、あなたは次のクエリ書くことができます:

// Find names of all events (for all people) 
var allNames = 
    (from p in people 
    from e in p.Events 
    select e.EventName).Distinct(); 

// Find events for every person 
var res = 
    from p in people 
    let known = p.Events.ToDictionary(e => e.EventName) 
    select new { 
    p.Name, 
    Events = allNames.Select(n => 
     known.ContainsKey(n)?known[n].EventLocation:"N/A") 
    }; 

を最初のクエリは、すべてのイベントの名前を取得します(私たちはすべての人のために、すべてのイベントの値を見つけるために、後でそれを使用)。 2番目のクエリは、すべての人に対して繰り返されます。最初にイベントを含む辞書を作成し(メモリ内の高速検索用)、すべてのイベント名を繰り返して辞書で検索します(見つからない場合は「N/A」を返します)。