2017-03-31 60 views
0

我用下面的MySQL查詢提取數據庫中的以下數據:如何獲取只有列表的指定項目?

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; 

提取的數據

enter image description here

我必須保存在從自己建有下面的代碼模型這個數據:

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); 
     } 

    }     
} 

模型

頁眉

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; } 
} 

調試應用程序,我得到一個錯誤的模型,還不如我想...

enter image description here

我想第一頭獲得前4行,第二頭獲得最後3行呃。

我該怎麼辦?

有什麼更好的做法:在得到這個模型,然後用linq處理它,或者得到正確的模型?

感謝

+0

使用的GroupBy上'名單'來實現上述期望的結果 –

+0

代碼中有一個問題它將所有屬性添加到HeaderValue,沒有任何酌情權或基於標頭值的分組 –

回答

0

您需要爲所期望的結果下面的代碼,進行必要的修改:

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

謝謝,我解決了在模型中添加一個新屬性_IdGroup_,然後根據IdGroup對結果進行分組。 – FabioBit

+0

很高興幫助,在原始代碼中,您必須首先在while循環內創建一個'List ',然後剩下的操作包括分組,創建標題和添加到模型中。在原始代碼中,您將所有內容放在循環中,這是錯誤的主要原因 –

相關問題