将IEnumerable <xelement>转换为XElement </xelement>

时间:2010-08-27 18:41:06

标签: ienumerable xelement

我的查询的返回类型是IEnumerable<XElement>。如何将结果数据转换为XElement类型?可能吗?有些人可以帮助我理解这一点。

var resQ = from e in docElmnt.Descendants(xmlns + Constants.T_ROOT)
                             .Where(x => x.Attribute(Constants.T_ID).Value == "testid") 
           select e;

我必须将resQ作为参数传递给下面的函数。为此,我必须将resQ转换为XElement类型。

Database.usp_InsertTestNQuestions(tid, qId, qstn, ans, resQ ); 

3 个答案:

答案 0 :(得分:8)

只要您的查询只返回单个结果,您就可以在结果上调用Single()或First()(此外,不需要额外的查询语法):

// Use if there should be only one value.
// Will throw an Exception if there are no results or more than one.
var resQ = docElmnt.Descendents(xmlns + Constants.T_ROOT)
                   .Single(x => x.Attribute(Constants.T_ID).Value == "testid");

// Use if there could be more than one result and you want the first.
// Will throw an Exception if there are no results.
var resQ = docElmnt.Descendents(xmlns + Contants.T_ROOT)
                   .First(x => x.Attribute(Constants.T_ID).Value == "testid");

如果你想在没有抛出异常的情况下没有为查询返回结果的情况下处理这种情况,你可以使用SingleOrDefault(如果得到多个结果,它仍会抛出异常)或{{1 }}

答案 1 :(得分:1)

您可以迭代查询中的每个元素,然后使用枚举器调用该方法。

resQ.ToList().ForEach(e => ...func... );

答案 2 :(得分:1)

除了Justin的回答,您可能希望允许返回0个元素或其他一些条件。

在这种情况下,只需执行:

IEnumerable<XElement> resQ = docElmnt.Descendents(xmlns + Constants.T_ROOT)
                   .Where(x => x.Attribute(Constants.T_ID).Value == "testid");
if(resQ.Count() == 0) {
  //handle no elements returned
} else if(resQ.Count() > 1) {
  //handle more than 1 elements returned
} else {
  XElement single = resQ.Single();
}

大多数时候我发现最好不要抛出错误 - 除非正好返回1个非常重要。