2017-03-31 58 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 ',然后剩下的操作包括分组,创建标题和添加到模型中。在原始代码中,您将所有内容放在循环中,这是错误的主要原因 –

相关问题