2010-05-06 142 views
0

我有一个数据表,看起来像这样。SQL到XML使用LINQ - 嵌套集合

name, hour, price1, price2, price3, price4, price5 
fred, 3, 12.5, 13.5, 14, 15, 16 
dave, 6, 8, 12, 18, 20.2, 25 
fred, 6, 10, 11, 14, 15, 19.7 

此表需要输出到一个xml文件,看起来像这样。

<timeCost> 
    <person name="fred"> 
    <time hour="5"> 
     <cost price="12.5" /> 
     <cost price="13.5" /> 
     <cost price="14" /> 
     <cost price="15" /> 
     <cost price="16" /> 
    </time> 
    <time hour="6"> 
     <cost price="10" /> 
     <cost price="11" /> 
     <cost price="14" /> 
     <cost price="15" /> 
     <cost price="19.7" /> 
    </time> 
    </person> 
    <person name="dave"> 
    <time hour="6"> 
     <cost price="8" /> 
     <cost price="12" /> 
     <cost price="18" /> 
     <cost price="20.2" /> 
     <cost price="25" /> 
    </time> 
    </person> 
</timeCost> 

我有一个LINQ查询来从SQL这样的数据这样的事情。

// initialize data context 
var people = from p in dc.people orderby p.name, p.hour select p; 

但是,我在使用linq(csharp)编写xml时遇到了麻烦。具体来说,问题是我不知道如何处理每个名称节点下的多个时间节点(嵌套循环/集合)。如何才能做到这一点?

这是一个sql 08 ent db如果它对任何人都很重要。

回答

1

您应该在该人的姓名上创建一个分组,也可能将价格选择到列表中。像下面的模型应该工作。

class Person 
{ 
    public string Name { get; set; } 
    public int Hour { get; set; } 
    public decimal Price1 { get; set; } 
    public decimal Price2 { get; set; } 
    public decimal Price3 { get; set; } 
    public decimal Price4 { get; set; } 
    public decimal Price5 { get; set; } 
} 

...

List<Person> people = new List<Person>() 
{ 
    new Person() { Name = "Fred", Hour = 3, Price1 = 12.5m, Price2 = 13.5m, Price3 = 14, Price4 = 15, Price5 = 16 }, 
    new Person() { Name = "Fred", Hour = 6, Price1 = 10, Price2 = 11, Price3 = 14, Price4 = 15, Price5 = 19.7m }, 
    new Person() { Name = "Dave", Hour = 6, Price1 = 8, Price2 = 12, Price3 = 18, Price4 = 20.2m, Price5 = 25 } 
}; 

var query = from p in people 
      group p by p.Name into pg 
      select new 
      { 
       Name = pg.Key, 
       Records = from record in pg 
          select new 
          { 
           Hour = record.Hour, 
           Prices = new List<Decimal>() { record.Price1, record.Price2, record.Price3, record.Price4, record.Price5 } 
          } 
      }; 

XDocument document = new XDocument(new XElement("timeCost", 
           from person in query 
           select new XElement("person", new XAttribute("name", person.Name), 
            from record in person.Records 
            select new XElement("time", new XAttribute("hour", record.Hour), 
             from price in record.Prices 
             select new XElement("cost", new XAttribute("price", price)))))); 

的的XDocument现在看起来是这样

<timeCost> 
    <person name="Fred"> 
    <time hour="3"> 
     <cost price="12.5" /> 
     <cost price="13.5" /> 
     <cost price="14" /> 
     <cost price="15" /> 
     <cost price="16" /> 
    </time> 
    <time hour="6"> 
     <cost price="10" /> 
     <cost price="11" /> 
     <cost price="14" /> 
     <cost price="15" /> 
     <cost price="19.7" /> 
    </time> 
    </person> 
    <person name="Dave"> 
    <time hour="6"> 
     <cost price="8" /> 
     <cost price="12" /> 
     <cost price="18" /> 
     <cost price="20.2" /> 
     <cost price="25" /> 
    </time> 
    </person> 
</timeCost>