2010-12-17 41 views
0

我有一個包含列表屬性的實體對象。我想將列表值向右擴展。作爲LINQ的新手,我不確定如何做到這一點。我可以強烈地鍵入一個對象,但是在編譯時我必須知道count/values,我想使它更具動態性。Linq有關列表屬性的「報告」問題

說我想要的輸出是一樣的東西:


名稱                                    demo1的        DEMO2       Demo3
人名1           TX                     TX
人名稱2           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") 
    }; 

第一個查詢得到的所有事件的名稱(我們使用它以後找到的所有事件的每個人一個值)。第二個查詢遍歷所有人。它首先創建帶有事件的字典(用於在內存中快速查找),然後迭代所有事件名稱並嘗試在字典中找到它們(如果未找到,則返回「N/A」)。