2010-09-13 2 views
0

Iv получил две таблицы DB. Один из них содержит типы (Id, Name), а другой содержит данные (RefId, Date, Value), на которые ссылаются типы. Мне нужно, чтобы создать XML-файл со следующим strukture:Справка по Linq для XML

<?xml version='1.0' encoding='utf-8' ?> 
<root> 
    <type> 
     <name></name> 
     <data> 
     <date></date> 
     <temp></temp> 
     </data> 
     <data> 
     <date></date> 
     <temp></temp> 
     </data> 
     <data> 
     <date></date> 
     <temp></temp> 
     </data> 
    </type> 
</root> 

И IV получил следующий код, чтобы сделать это

public XmlDocument HelloWorld() 
    { 
     string tmp = ""; 
     try 
     { 
      sqlConn.ConnectionString = ConfigurationManager.ConnectionStrings["NorlanderDBConnection"].ConnectionString; 
      DataContext db = new DataContext(sqlConn.ConnectionString); 

      Table<DataType> dataTypes = db.GetTable<DataType>(); 
      Table<DataPoints> dataPoints = db.GetTable<DataPoints>(); 

      var dataT = 
         from t in dataTypes 
         select t; 
      var dataP = 
       from t in dataTypes 
       join p in dataPoints on t.Id equals p.RefId 
       select new 
       { 
        Id = t.Id, 
        Name = t.Name, 
        Date = p.PointDate, 
        Value = p.PointValue 
       }; 

      string xmlString = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><root></root>"; 

      XmlDocument xmldoc = new XmlDocument(); 

      xmldoc.LoadXml(xmlString); 

      int count = 0; 
      foreach (var dt in dataT) 
      { 
       XmlElement type = xmldoc.CreateElement("type"); 
       XmlElement name = xmldoc.CreateElement("name"); 
       XmlNode nameText = xmldoc.CreateTextNode(dt.Name); 
       name.AppendChild(nameText); 
       type.AppendChild(name);      

       foreach(var dp in dataP.Where(dt.Id = dp.RefId)) 
       { 
        XmlElement data = xmldoc.CreateElement("data"); 
        XmlElement date = xmldoc.CreateElement("date"); 
        XmlElement temp = xmldoc.CreateElement("temp"); 

        XmlNode dateValue = xmldoc.CreateTextNode(dp.Date.ToString()); 
        date.AppendChild(dateValue); 

        XmlNode tempValue = xmldoc.CreateTextNode(dp.Value.ToString()); 
        temp.AppendChild(tempValue); 

        data.AppendChild(date); 
        data.AppendChild(temp); 

        type.AppendChild(data); 
       } 

       xmldoc.DocumentElement.AppendChild(type); 

      } 

      return xmldoc; 
     } 
     catch(Exception e) 
     { 
      tmp = e.ToString(); 
     } 

     return null; 
    } 

    [Table(Name="DataTypes")] 
    public class DataType 
    { 
     [Column(IsPrimaryKey = true)] 
     public long Id; 
     [Column] 
     public string Name; 
    } 
    [Table(Name="DataPoints")] 
    public class DataPoints 
    { 
     [Column] 
     public long RefId; 
     [Column] 
     public DateTime PointDate; 
     [Column] 
     public double PointValue; 
    } 

Это не рабочий код. У меня возникают проблемы с LINQ и внутренними соединениями. Может кто-то, пожалуйста, помогите мне получить правильную структуру. Я надеюсь, что это будет ясно, что они пытаются достичь.

С наилучшими пожеланиями Marthin

+0

Можете ли вы объяснить, что-то о основной цели этого? Какова цель приложения? –

+0

BTW: XmlDocument/XmlElement ** не является ** Linq для XML. – dtb

+0

Мозг болит меньше, когда один более мелкий метод пишет, да. –

ответ

3
var result = 
    new XDocument(new XElement("root", 
     from dt in dataTypes 
     join dp in dataPoints on dt.Id equals dp.RefId 
     select new XElement("type", 
      new XElement("name", dt.Name), 
      new XElement("data", 
       new XElement("date", dp.PointDate), 
       new XElement("temp", dp.PointValue))))); 

var result = 
    new XDocument(new XElement("root", 
     from dt in dataTypes 
     select new XElement("type", 
      new XElement("name", dt.Name), 
      from dp in dataPoints 
      where dp.RefId == dt.Id 
      select new XElement("data", 
       new XElement("date", dp.PointDate), 
       new XElement("temp", dp.PointValue))))); 
+0

Спасибо за это. Я еще не пробовал, но, похоже, это трюк =). Таким образом, вы можете комбинировать LINQ и XML в одном и том же «запросе»? Получил ли linqs для новичка, который объясняет это немного больше? – Marthin

+0

@ Мартин: Я не уверен, что вы можете комбинировать LINQ-to-SQL и LINQ-to-XML в одном запросе, но вы должны иметь возможность комбинировать LINQ-To-Objects и LINQ-to-XML в показанном виде , (I.e., вам может потребоваться добавить AsEnumerable после предложения join.) – dtb

+0

Да, вы можете приклеить IEnumberable objects вместе в мире LINQ. – PerlDev

Смежные вопросы