2016-11-29 73 views
0

用LINQ可以實現這一點嗎?我有一個從數據庫填充的類。有孩子和他的父母信息。兒童姓名,姓氏,班級信息,聯繫人。父母姓名,聯繫人。孩子可能有多個父母。Linq強類型嵌套列表

public class KontaktiniaiDuomenysPartialViewModel 
{ 
    /// <summary> 
    /// Child ID 
    /// </summary> 
    public long AsmenysId { get; set; } 
    /// <summary> 
    /// Child name 
    /// </summary> 
    public string Vardas { get; set; } 
    /// <summary> 
    /// Child surname 
    /// </summary> 
    public string Pavarde { get; set; } 
    /// <summary> 
    /// Child class ID 
    /// </summary> 
    public long KlasesId { get; set; } 
    /// <summary> 
    /// Child class name 
    /// </summary> 
    public string KlasesPavadinimas { get; set; } 
    /// <summary> 
    /// Child phone 
    /// </summary> 
    public string Telefonas { get; set; } 
    /// <summary> 
    /// Child mobile phone 
    /// </summary> 
    public string MobilusTelefonas { get; set; } 
    /// <summary> 
    /// Child email 
    /// </summary> 
    public string El_pastas { get; set; } 
    /// <summary> 
    /// Child Address 
    /// </summary> 
    public string Adresas { get; set; } 
    /// <summary> 
    /// Child father's/mother's id 
    /// </summary> 
    public long TevoAsmenysId { get; set; } 
    /// <summary> 
    /// Child father's/mother's address 
    /// </summary> 
    public string TevoAdresas { get; set; } 
    /// <summary> 
    /// Child father's/mother's name 
    /// </summary> 
    public string TevoVardas { get; set; } 
    /// <summary> 
    /// Child father's/mother's surname 
    /// </summary> 
    public string TevoPavarde { get; set; } 
    /// <summary> 
    /// Child father's/mother's email 
    /// </summary> 
    public string TevoElPastas { get; set; } 
    /// <summary> 
    /// Child father's/mother's phone 
    /// </summary> 
    public string TevoTelefonas { get; set; } 
    /// <summary> 
    /// Child father's/mother's phone 
    /// </summary> 
    public string TevoMobilusTelefonas { get; set; } 

} 

實施例填充這個類:

List<KontaktiniaiDuomenysPartialViewModel> data = new List<KontaktiniaiDuomenysPartialViewModel>(); 

KontaktiniaiDuomenysPartialViewModel data1 = new KontaktiniaiDuomenysPartialViewModel(); 

data1.AsmenysId = 1; 
data1.Vardas = "Petras"; 
data1.Pavarde = "Petraitis"; 
data1.KlasesId = 2; 
data1.KlasesPavadinimas = "k1"; 
data1.Telefonas = "860000000"; 
data1.MobilusTelefonas = "870000000"; 
data1.El_pastas = "[email protected]"; 
data1.Adresas = "balt23"; 
// Petras mother info 
data1.TevoAsmenysId = 3; 
data1.TevoVardas = "Dalia"; 
data1.TevoPavarde = "zuk"; 
data1.TevoElPastas = "[email protected]"; 
data1.TevoTelefonas = "861111111"; 
data1.TevoMobilusTelefonas = "862222222"; 
data1.TevoAdresas = "Kaunas"; 

KontaktiniaiDuomenysPartialViewModel data2 = new KontaktiniaiDuomenysPartialViewModel(); 

data2.AsmenysId = 1; 
data2.Vardas = "Petras"; 
data2.Pavarde = "Petraitis"; 
data2.KlasesId = 2; 
data2.KlasesPavadinimas = "k1"; 
data2.Telefonas = "860000000"; 
data2.MobilusTelefonas = "870000000"; 
data2.El_pastas = "[email protected]"; 
data2.Adresas = "balt23"; 
// Petras father info 
data2.TevoAsmenysId = 4; 
data2.TevoVardas = "juoz"; 
data2.TevoPavarde = "luk"; 
data2.TevoElPastas = "[email protected]"; 
data2.TevoTelefonas = "863333333"; 
data2.TevoMobilusTelefonas = "864444444"; 
data2.TevoAdresas = "Vilnius"; 

KontaktiniaiDuomenysPartialViewModel data3 = new KontaktiniaiDuomenysPartialViewModel(); 
data3.AsmenysId = 2; 
data3.Vardas = "Eivis"; 
data3.Pavarde = "Konc"; 
data3.KlasesId = 5; 
data3.KlasesPavadinimas = "k5"; 
data3.MobilusTelefonas = "880000000"; 
data3.Telefonas = "865555555"; 
data3.El_pastas = "[email protected]"; 
data3.Adresas = "balt28"; 
// Eivis father info 
data3.TevoAsmenysId = 5; 
data3.TevoVardas = "obb"; 
data3.TevoPavarde = "tre"; 
data3.TevoElPastas = "[email protected]"; 
data3.TevoTelefonas = "866666666"; 
data3.TevoMobilusTelefonas = "867777777"; 
data3.TevoAdresas = "KLP"; 

data.Add(data1); 
data.Add(data2); 
data.Add(data3); 

欲組數據到這個類:

public class KontaktiniaiDuomenysPartialViewModelGrouped 
{ 
    /// <summary> 
    /// Child id 
    /// </summary> 
    public long AsmenysId { get; set; } 
    /// <summary> 
    /// Child name 
    /// </summary> 
    public string Vardas { get; set; } 
    /// <summary> 
    /// Child surname 
    /// </summary> 
    public string Pavarde { get; set; } 
    /// <summary> 
    /// Child class 
    /// </summary> 
    public KlaseModels Klase { get; set; } 
    /// <summary> 
    /// Child father's/mother's info 
    /// </summary> 
    public IList<TevoKontaktai> Tevaii { get; set; } 
    /// <summary> 
    /// Child contacts 
    /// </summary> 
    public KontaktiniaiDuomenysModel Kontaktai { get; set; } 
} 

額外類:

public class KlaseModels 
{ 
    /// <summary> 
    /// child class id 
    /// </summary> 
    public long Id { set; get; } 
    /// <summary> 
    /// Child class name 
    /// </summary> 
    public string Pavadinimas { set; get; } 
} 
public class TevoKontaktai 
{ 
    /// <summary> 
    /// Child father's/mother's id 
    /// </summary> 
    public long AsmenysId { get; set; } 
    /// <summary> 
    /// Child father's/mother's name 
    /// </summary> 
    public string Vardas { get; set; } 
    /// <summary> 
    /// Child father's/mother's surname 
    /// </summary> 
    public string Pavarde { get; set; } 
    /// <summary> 
    /// Child father's/mother's contacts 
    /// </summary> 
    public KontaktiniaiDuomenysModel Kontaktai { get; set; } 
} 

public class KontaktiniaiDuomenysModel 
{ 
    /// <summary> 
    /// Child father's/mother's email 
    /// </summary> 
    public string ElPastas { get; set; } 
    /// <summary> 
    /// Child father's/mother's phone 
    /// </summary> 

    public string Telefonas { get; set; } 
    /// <summary> 
    /// Child father's/mother's mobile phone 
    /// </summary> 

    public string MobilusTelefonas { get; set; } 
    /// <summary> 
    /// Child father's/mother's address 
    /// </summary> 
    public string Adresas { get; set; } 
} 

預期結果:

IList<KontaktiniaiDuomenysPartialViewModelGrouped> afterLinq 

afterLinq[0] 

afterLinq[0].AsmenysId = 1 
afterLinq[0].Vardas = "Petras" 
afterLinq[0].Pavarde = "Petraitis" 

afterLinq[0].Klase.Id = 2 
afterLinq[0].Klase.Pavadinimas = "k1" 
afterLinq[0].Kontaktai.ElPastas = "[email protected]" 
afterLinq[0].Kontaktai.Telefonas = "860000000" 
afterLinq[0].Kontaktai.MobilusTelefonas = "870000000" 
afterLinq[0].Kontaktai.Adresas = "balt23" 

afterLinq[0].Tevaii[0].AsmenysId = 3 
afterLinq[0].Tevaii[0].Vardas = "Dalia" 
afterLinq[0].Tevaii[0].Pavarde = "zuk" 
afterLinq[0].Tevaii[0].Kontaktai.ElPastas = "[email protected]" 
afterLinq[0].Tevaii[0].Kontaktai.Telefonas = "861111111" 
afterLinq[0].Tevaii[0].Kontaktai.MobilusTelefonas = "862222222" 
afterLinq[0].Tevaii[0].Kontaktai.Adresas = "Kaunas"; 

afterLinq[0].Tevaii[1].AsmenysId = 4 
afterLinq[0].Tevaii[1].Vardas = "juoz" 
afterLinq[0].Tevaii[1].Pavarde = "luk" 
afterLinq[0].Tevaii[1].Kontaktai.ElPastas = "[email protected]" 
afterLinq[0].Tevaii[1].Kontaktai.Telefonas = "863333333" 
afterLinq[0].Tevaii[1].Kontaktai.MobilusTelefonas = "864444444" 
afterLinq[0].Tevaii[1].Kontaktai.Adresas = "Vilnius"; 







afterLinq[1] 

afterLinq[1].AsmenysId = 2 
afterLinq[1].Vardas = "Eivis" 
afterLinq[1].Pavarde = "Konc" 

afterLinq[1].Klase.Id = 5 
afterLinq[1].Klase.Pavadinimas = "k5" 


afterLinq[1].Kontaktai.ElPastas = "[email protected]" 
afterLinq[1].Kontaktai.Telefonas = "865555555" 
afterLinq[1].Kontaktai.MobilusTelefonas = "880000000" 
afterLinq[1].Kontaktai.Adresas = "balt28" 

afterLinq[1].Tevaii[0].AsmenysId = 5 
afterLinq[1].Tevaii[0].Vardas = "obb" 
afterLinq[1].Tevaii[0].Pavarde = "tre" 
afterLinq[1].Tevaii[0].Kontaktai.ElPastas = "[email protected]" 
afterLinq[1].Tevaii[0].Kontaktai.Telefonas = "866666666" 
afterLinq[1].Tevaii[0].Kontaktai.MobilusTelefonas = "867777777" 
afterLinq[1].Tevaii[0].Kontaktai.Adresas = "KLP"; 
+1

你試過了什麼? –

+4

一些建議:減少你的模型,問題仍然與你的班級中的2個屬性和16個屬性相同。這太方便了,誰會讀這個問題的負擔,所以人們會跳過這個問題。它也可能有助於將事情變爲英語,所以人們會知道每個財產的含義,而不是猜測或再次跳過問題。 –

回答

1
 var grouped = new[] { data1, data2, data3 } 
      .GroupBy(kd => new 
      { 
       kd.AsmenysId, 
       kd.Vardas, 
       kd.Pavarde, 
       kd.KlasesId, 
       kd.KlasesPavadinimas, 
       kd.El_pastas, 
       kd.Telefonas, 
       kd.MobilusTelefonas, 
       kd.Adresas 
      }) 
      .Select(g => new KontaktiniaiDuomenysPartialViewModelGrouped 
      { 
       AsmenysId = g.Key.AsmenysId, 
       Vardas = g.Key.Vardas, 
       Pavarde = g.Key.Pavarde, 
       Klase = new KlaseModels 
       { 
        Id = g.Key.KlasesId, 
        Pavadinimas = g.Key.KlasesPavadinimas 
       }, 
       Kontaktai = new KontaktiniaiDuomenysModel 
       { 
        ElPastas = g.Key.El_pastas, 
        Telefonas = g.Key.Telefonas, 
        MobilusTelefonas = g.Key.MobilusTelefonas, 
        Adresas = g.Key.Adresas 
       }, 
       Tevaii = g.Select(kd => new TevoKontaktai { 
        AsmenysId = kd.TevoAsmenysId, 
        Vardas = kd.TevoVardas, 
        Pavarde = kd.TevoPavarde, 
        Kontaktai = new KontaktiniaiDuomenysModel 
        { 
         ElPastas = kd.TevoElPastas, 
         Telefonas = kd.TevoTelefonas, 
         MobilusTelefonas = kd.TevoMobilusTelefonas, 
         Adresas = kd.TevoAdresas 
        } 
       }).ToList() 
      }); 

順便說一句,我猜關係數據表可能是你的扁平化模式的原因,但事實上,你可以使用像XML的一些技術加載層次模型,或者您可以使用的NoSQL數據庫嘗試。 :D

+0

謝謝你,先生。 –