2010-09-13 7 views
0

Iv a deux tables DB. L'un contenant des types (Id, Name) et l'autre contient des points de données (RefId, Date, Value) qui sont référencés par les types. Je dois créer un fichier XML avec le strukture suivant:Aide pour Linq to 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 a obtenu le code suivant pour faire

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

Ce n'est pas un code de travail. Im ayant des problèmes avec LINQ et les jointures internes. Quelqu'un pourrait-il m'aider s'il vous plaît à obtenir la strukture correcte. J'espère que c'est un peu clair ce que j'essaie de faire.

Cordialement Marthin

+0

Pouvez-vous expliquer quelque chose sur le but sous-jacent de cette situation? Quel est le but de l'application? –

+0

BTW: XmlDocument/XmlElement ** n'est pas ** Linq to XML. – dtb

+0

Le cerveau fait moins mal quand une méthode plus petite écrit, oui. –

Répondre

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

Merci pour cela. Je n'ai pas encore essayé, mais il semble faire l'affaire =). Vous pouvez donc combiner LINQ et XML dans la même "requête"? Vous avez des linqs pour un novice qui explique cela un peu plus? – Marthin

+0

@Marthin: Je ne suis pas sûr si vous pouvez combiner LINQ-to-SQL et LINQ-to-XML en une seule requête, mais vous devriez être capable de combiner LINQ-To-Objects et LINQ-to-XML de la manière montrée . (Par exemple, vous devrez peut-être ajouter un AsEnumerable après la clause de jointure.) – dtb

+0

Oui, vous pouvez coller des objets IEnumberable ensemble dans le monde LINQ. – PerlDev