2016-09-29 5 views
0
var records = (from root in myxmlDoc.Descendants("Root") 
       from nts in root.Elements("nts") 
       select new 
       { 
        Id = (nts.Elements("Id").Any() == true) ? (nts.Element("Id").Value) : string.Empty, 
        Name = (nts.Elements("Name").Any() == true) ? (nts.Element("Name").Value) : string.Empty, 
       }).ToList(); 

mehr Kind, das, wie ich diese Elemente mit <Round> hier <Round> achive kann, wird mehr Male nicht fest Zahl sein AM hat auch in der Nähe von dynamischen Aufzeichnungen nehmen Datumwie Kind einzelne Datensätze zu erhalten, basierend auf mehrere Bedingung Knoten C# Linq oder XPath

<Root> 
    <nts> 
    <Id>A</Id> 
    <Name>Rahul</Name> 
    <Round> 
     <prodDate>2016-03-31</prodDate> 
     <roundDue>0.00</roundDue> 
    </Round> 
    <Round> 
     <prodDate>2016-04-01</prodDate> 
     <roundDue>400.00</roundDue> 
    </Round> 
    <Round> 
     <prodDate>2016-05-01</prodDate> 
     <roundDue>300.00</roundDue> 
    </Round> 
    <Round> 
     <prodDate>2016-08-06</prodDate> 
     <roundDue>100.00</roundDue> 
    </Round> 
    <nts> 
    </Root> 

ich möchte von mehreren <Round> Element basierend auf folgenden Kriterien Einzel <Round> Datensatz nehmen

  1. 1) prodDate weniger als dynamicDate dh: 2016.09.29 und roundDue> 0 Hinweis: <Round> Datensatz muss letzten Datensatz kleiner sein als die dynamicDate dh 2016-09-29

Erwartetes Ergebnis:

ID : A; 
Name : Rahul 
prodDate : 2016-08-06 
roundDue : 100.00 

hier prodDate muss spätestens näher Datum dynamicDate sein dh 2016-09-29

+1

Was hast du, das funktioniert nicht? – Kilazur

+0

Es klingt wie Sie haben zwei tatsächliche * Filter * (Datum weniger als 2016-09-29, und roundDue größer als 0), und dann eine Bestellung (nach Datum, absteigend). Sie können dann das erste Ergebnis aus dieser geordneten Ergebnismenge nehmen. –

+0

Ich habe meinen Code eingefügt Ich habe keine Ahnung, wie kann ich das erreichen –

Antwort

0

Versuchen Sie folgendes:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication16 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 
      //Note : new DataTime gives a date of 1/1/1900. Any valid date should be much closer to actual compare date 
      var results = doc.Descendants("nts").Select(x => new 
      { 
       id = (string)x.Element("Id"), 
       name = (string)x.Element("Name"), 
       round = x.Elements("Round").Select(y => new { prodDate = (object)y.Element("prodDate") == null ? new DateTime() : (DateTime)y.Element("prodDate") , roundDue = (decimal)y.Element("roundDue") }) 
        .Where(y => y.roundDue > 0 && y.prodDate < DateTime.Now).OrderBy(y => DateTime.Now - y.prodDate).FirstOrDefault() 
      }).FirstOrDefault(); 

     } 
    } 
} 
+0

hier haben Sie nicht DynamicDate ie 2016-09-29 verwendet (dies wird Chnage jedes Mal, wenn es dynamisch ist) und ProdDate muss am nächsten zu dynamischen Datum 2016-09 -29 –

+0

ich habe es versucht: aber jetzt aber nicht den wert von roundDue id = (string) x.Element ("Id"), name = (string) x.Element ("Name"), round = x.Elements ("Rund") Wählen Sie (y => new {prodDate = (DateTime) y.Element ("prodDate"), roundDue = (dezimal) y.Element ("roundDue")}) .Wohin (y => y .roundDue> 0 && y.prodDate y.prodDate) }). FirstOrDefault(); –

+0

Ich habe den Code geändert. – jdweng

Verwandte Themen