2016-04-26 3 views
0

У меня есть запрос LINQ, где я выбираю родительский элемент, который имеет предложение where и orderby. Мне нужен только первый результат, поэтому я применяю к нему .Take(1). Затем мне нужно выбрать два отдельных дочерних узла из родителя, каждый из которых имеет предложения «где».LINQ Подзапрос после .Take (1)

Я успешно выполнил это с использованием двух различных запросов LINQ, но мне кажется, что в нем должен быть только один запрос с подзапросом в нем, часть, которая меня висит, - это .Take(1) на родительском элементе, звоните без ошибок.

Вот что у меня есть сейчас, можно ли объединить их в один запрос?

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

и:

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

какая ошибка вы получите и вы можете разместить образец XML? – rojobo

ответ

1

Только быстрая попытка:

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

Переписан:

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

Это кажется близким (и очень чистым), но я получаю сообщение об ошибке «XElement не содержит определения для Where и no extension, принимающего первый аргумент типа XElement» на p.Where() – DasBeasto

+0

Обновлено, у меня было '.Elements' в неправильном месте. –

+0

Отличное спасибо! – DasBeasto