2017-04-22 6 views
1
Zum Wörterbuch

Ich habe folgende Klassen:eine Liste Konvertieren

public class Header 
{ 
    public int Id { get; set; } 
    .... 
} 
public class Item 
{ 
    public int Id { get; set; } 
    public int HeaderId { get; set; } //FK 
    public int ItemSequence { get; set; } 
    public string Value { get; set; } 
    ... 
} 

Header und Item haben eine Eins-zu-viele-Beziehung (jeweils Header hat viele Items

Ich habe folgende Items:

{{Id=1, HeaderId=1, ItemSequence =1, Value="A"}, 
{Id=2, HeaderId=1, ItemSequence =2, Value="B"}, 
{Id=3, HeaderId=2, ItemSequence =1, Value="C"}, 
{Id=4, HeaderId=2, ItemSequence =2, Value="D"}, 
{Id=5, HeaderId=2, ItemSequence =3, Value="B"}} 

Ich möchte eine Abfrage schreiben, um ein Wörterbuch zu finden, der Schlüssel ist zuerst ItemSequence von jedem Header (ItemSequence = 1) und der Wert ist, andere ItemSequence s Werte, in dem anderen Wort, das ich folgendes Ergebnis erreichen wollen:

Key: {HeaderId=1, ItemSequence =1} , Values : {"A","B"} 
Key: {HeaderId=2, ItemSequence =1} , Values : {"C","D","B"} 

Ich schrieb Abfrage folgende:

var result = ctx.Headers 
       .SelectMany(x => x.Items 
            .Select(t => new { t.Id,t.ItemSequence,t.HeaderId})) 
            .? 

welcher Code sollte ich stattdessen verwenden ??

Antwort

0

Etwas wie: obwohl

var result = 
    ctx 
    .Headers 
    .ToDictionary(   
     header => new { 
     header.Id, 
     header.Items.First().ItemSequence 
     }, 
     header => 
     header 
     .Items 
     .Select(item => item.Value) 
     .ToList() 
    ); 

würde davon ausgehen, dass alle Header mindestens einen Punkt haben.

darüber nachzudenken, es ist möglich, dass Sie die erste wollen bestellt ItemSequence, wobei in diesem Fall die Verwendung so etwas wie:

header.Items.OrderBy(item => item.ItemSequence).First().ItemSequence 

Um Header ohne Elemente zu ignorieren verwenden:

ctx 
.Headers 
.Where(header => header.Items.Any()) 
... 
0

In Ihrem gewünschtes Ergebnis, ItemSequence ist immer gleich 1. Ich denke, es ist überflüssig. Sie könnten group by HeaderId und konvertieren Sie es in Dictionary wie folgt.

 var listItems = new List<Item>() 
     { 
       new Item(){Id=1, HeaderId=1, ItemSequence =1, Value="A"}, 
       new Item(){Id=2, HeaderId=1, ItemSequence =2, Value="B"}, 
       new Item(){Id=3, HeaderId=2, ItemSequence =1, Value="C"}, 
       new Item(){Id=4, HeaderId=2, ItemSequence =2, Value="D"}, 
       new Item(){Id=5, HeaderId=2, ItemSequence =3, Value="B"} 
     }; 

     var lstGroup = (from item in listItems 
      group item by item.HeaderId 
      into gr 
      select new 
      { 
       HeaderId = gr.Key, 
       ItemSequence = 1, // it's redundant, you could remove it... 
       ListValue = string.Join(",", gr.Select(x => x.Value).ToList()) // return "A,B",.... 
      }).ToDictionary(x=>new {x.HeaderId,x.ItemSequence}, x=> x.ListValue); 
Verwandte Themen