2013-11-28 143 views
2

我試圖將平面結構轉換爲層次結構。將平面列表轉換爲對象

名單看​​起來是這樣的,其中PERSONID,第一和姓氏不止一次發生:

public class VisitType 
{ 
    public Guid Id { get; set; } 
    public Guid PersonId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public string VisitName { get; set; } 

    public DateTime TimeFrom { get; set; } 
    public DateTime TimeTo { get; set; } 

} 

我想將它轉化成這個樣子,而不是在客戶端只發生一次,每次訪問被歸入:

public class Client { 

    public String FirstName { get; set; } 
    public string LastName { get; set; } 
    public Guid PersonId { get; set; } 

    public Visit[] Visits { get; set; } 
} 
public class Visit { 

    public string Name { get; set; } 
    public DateTime StartBefore { get; set; } 
    public DateTime StartAfter { get; set; } 

} 

什麼是最快的方法呢?

+0

你有你自己嘗試新鮮事物? – Matten

+0

我試過某種形式的使用LINQ的分組,但不能正確地進行分組。另外我想知道它是最快的? – isshin

+2

向我們展示您迄今爲止所做的工作。 – Matten

回答

2

嘗試在LinqPad

var list = new []{ 
    new { PersonId = 1, Name = "Is", Lastname = "Shin", VisitName = "a" }, 
    new { PersonId = 1, Name = "Is", Lastname = "Shin", VisitName = "b" }, 
}; 

(
from i in list 
group i by i.PersonId into g 
let first = g.First() 
select new { 
    Person = new { ID = first.PersonId, Name = first.Name, Lastname = first.Lastname }, 
    Visits = g.Select(gi => new { VisitName = gi.VisitName }) 
} 
).Dump(); 
+0

謝謝,這似乎是個伎倆。去嘗試一下。 – isshin

1

只是爲了保持完整性,使用method syntax,我個人更喜歡相同的查詢:

var result = visitLists.GroupBy(vt => vt.PersonId, (g, e) => 
    new 
    { 
     First = e.First(), 
     List = e 
    }).Select(i => 
    new Client() 
    { 
     FirstName = i.First.FirstName, 
     LastName = i.First.LastName, 
     PersonId = i.First.PersonId, 
     Visits = i.List.Select(vt => new Visit() 
       { 
        Name = vt.VisitName, 
        StartAfter = vt.TimeFrom, 
        StartBefore = vt.TimeTo 
       }).ToArray() 
    }).ToList(); 
相關問題