2016-04-26 35 views
0

Ich habe eine LINQ-Abfrage, wo ich ein übergeordnetes Element auswählen, das eine where und orderby -Klausel hat, brauche ich nur das erste Ergebnis davon, so dass ich eine .Take(1) darauf anwenden. Dann muss ich zwei separate Kinderknoten vom Eltern auswählen, die jeweils "wo" -Klauseln haben.LINQ Unterabfrage nach .Take (1)

Ich habe dies erfolgreich mit zwei verschiedenen LINQ-Abfragen, aber ich denke, es sollte nur eine Abfrage mit einer Unterabfrage in es, der Teil, der mich aufhängen ist die .Take(1) auf dem Elternteil, die Unterabfrage kann danach nicht weiter Anruf ohne Fehler.

Hier ist was ich jetzt habe, ist es möglich, diese in einer Abfrage zu kombinieren?

var parent= 
    (from parentXML in myDal.GetMyXML().Elements("parentElements") 
    where DateTime.Parse((string)parentXML.Attribute("startDate")) <= currentDate 
    orderby DateTime.Parse((string)parentXML.Attribute("startDate")) descending 
    select parentXML).Take(1); 

und:

var children = 
    (from firstChild in parent.Elements("childElements") 
    where (string)firstChild.Attribute("type") == "first" 
    from secondChild in parent.Elements("childElements") 
    where (string)secondChild.Attribute("type") == "second" 
    select new { first = firstChild , second = secondChild }).ToList(); 
+0

welche Fehler bekommen Sie und können Sie eine XML-Beispiel posten? – rojobo

Antwort

1

Nur ein kurzer Versuch:

var children = 
    (from parentXML in myDal.GetMyXML().Elements("parentElements") 
where DateTime.Parse((string)parentXML.Attribute("startDate")) <= currentDate 
orderby DateTime.Parse((string)parentXML.Attribute("startDate")) descending 
select parentXML).Select(p=>new { 
    first=p.Elements("childElements").Where(f=>f.Attribute("type")=="first"), 
    second=p.Elements("childElements").Where(f=>f.Attribute("type")=="second")}) 
.Take(1); 

Rewritten:

var children = 
    myDal.GetMyXML() 
    .Elements("parentElements") 
    .Where(p=>DateTime.Parse((string)p.Attribute("startDate"))<=currentDate) 
    .OrderByDescending(p=>DateTime.Parse((string)p.Attribute("startDate"))) 
    .Select(p=>new { 
     first=p.Elements("childElements").Where(f=>f.Attribute("type")=="first"), 
     second=p.Elements("childElements").Where(f=>f.Attribute("type")=="second")}) 
    .Take(1); 
+0

Dies scheint nah (und sehr sauber), aber ich bekomme den Fehler "XElement enthält keine Definition für Where und keine Erweiterung ein erstes Argument des Typs XElement akzeptieren" auf der p.Where() – DasBeasto

+0

Updated, ich hatte die '.Elements' an der falschen Stelle. –

+0

Perfekt danke! – DasBeasto

Verwandte Themen