2017-03-31 7 views
0

ich extrahieren Sie die folgenden Daten aus der Datenbank mit der folgenden MySQL Query:Wie bekomme ich nur einen bestimmten Listeneintrag?

SELECT vs.value, vs.is_header, vsa.is_required, vsa.name, vsar.value 
FROM vista_struttura AS vs 
LEFT JOIN vista_struttura_attributi AS vsa 
    ON vs.id_vista_struttura = vsa.id_vista_struttura 
LEFT JOIN vista_struttura_attributi_raccordi AS vsar 
    ON vsa.input_type = vsar.input_type 
ORDER BY vs.sort; 

Daten extrahiert werden

enter image description here

ich diese Daten in einem Modell von mir selbst mit dem folgenden Code gebaut speichern habe :

var model = new List<Header>(); 
using (var connection = new MySqlConnection(connectionString)) 
{ 
    connection.Open();         
    var sql = "SELECT vs.value, vs.is_header, vsa.is_required, vsa.name, vsar.value " + 
       "FROM vista_struttura AS vs " + 
       "LEFT JOIN vista_struttura_attributi AS vsa " + 
        "ON vs.id_vista_struttura = vsa.id_vista_struttura " + 
       "LEFT JOIN vista_struttura_attributi_raccordi AS vsar " + 
        "ON vsa.input_type = vsar.input_type " + 
       "ORDER BY vs.sort"; 
    var cmd = new MySqlCommand(sql, connection); 
    var rdr = cmd.ExecuteReader(); 

    var rows = new List<ViewProperties>(); 

    while (rdr.Read()) 
    {   
     var value = rdr[0].ToString(); 
     var isHeader = Convert.ToBoolean(rdr[1]); 
     var isRequired = (rdr[2] == DBNull.Value) ? (bool?) null : Convert.ToBoolean(rdr[2]); 
     var name = rdr[3].ToString(); 
     var inputType = rdr[4].ToString(); 

     var properties = new ViewProperties() 
     { 
      Value = value, 
      IsHeader = isHeader, 
      IsRequired = isRequired, 
      Name = name, 
      InputType = inputType 
     };  

     rows.Add(properties); 

     var header = new Header() 
     {    
      HeaderValue = (properties.IsHeader == true) ? properties.Value : null, 
      Rows = rows 
     }; 
     if (header.HeaderValue != null) 
     { 
      model.Add(header); 
     } 

    }     
} 

Modelle

Kopf

public class Header 
{ 
    public string HeaderValue { get; set; } 
    public IList<ViewProperties> Rows { get; set; } 
} 

ViewProperties

public class ViewProperties 
{ 
    public string Value { get; set; } 
    public bool IsHeader { get; set; } 
    public bool? IsRequired { get; set; } 
    public string Name { get; set; } 
    public string InputType { get; set; } 
} 

Debuggen der Anwendung ich ein falsches Modell bekommen, nicht wie ich will ...

enter image description here

Ich möchte Holen Sie sich die ersten 4 Zeilen für den ersten Header und die anderen 3 Zeilen für den zweiten Header er.

Wie kann ich tun?

Was ist besser zu tun: Bevor Sie dieses Modell und dann mit linq umgehen, oder erhalten Sie bereits das richtige Modell?

Dank

+0

Verwenden GroupBy auf 'List ' das gewünschte Ergebnis –

+0

-Code oben zu erreichen, ein Problem aufgetreten ist Das Hinzufügen aller Eigenschaften zum HeaderValue, gibt es keine Diskretion oder Gruppierung basierend auf Header-Wert –

Antwort

0

Sie den folgenden Code benötigen für das gewünschte Ergebnis, die notwendigen Änderungen vornehmen:

var rows = new List<ViewProperties>(); // ViewProperties List 

// Segregate null value, GroupBy to aggregate using Value 
var viewPropertiesGrouping = rows.Where(x => x.IsHeader) 
           .GroupBy(x => x.Value); 

// Traverse through IEnumerable<IGrouping<string,ViewProperties>>, created above and fill the Header object and add to the Model 

foreach (var prop in viewPropertiesGrouping) 
{ 
    Header header = new Header(); 
    header.HeaderValue = prop.Key; 
    header.Rows = prop.Select(y => y).ToList(); 
    model.Add(header); 
} 
+0

Danke, ich löste das Hinzufügen einer neuen Eigenschaft _IdGroup_ im Modell und dann Gruppierung Ergebnis basierend auf IdGroup. – FabioBit

+0

Froh, dass es geholfen hat, im ursprünglichen Code zuerst eine 'List ' innerhalb der while-Schleife zu erstellen, dann muss die restliche Operation einschließlich Gruppierung, Erstellen der Kopfzeile und Hinzufügen zum Modell außerhalb geschehen. Im Original-Code haben Sie alles in die while-Schleife eingefügt, was der Hauptgrund für den Fehler ist –

Verwandte Themen