LINQ子查询后.Take(1)

时间:2016-04-26 15:16:30

标签: c# linq

我有一个LINQ查询,我选择一个具有whereorderby子句的父元素,我只需要第一个结果,所以我应用.Take(1)。然后我需要从父节点中选择两个单独的子节点,每个子节点都有“where”子句。

我已经使用两个不同的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();

1 个答案:

答案 0 :(得分: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);