Конвертировать IEnumerable <XElement>в XElement - PullRequest
3 голосов
/ 27 августа 2010

Тип возврата моего запроса 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 ]

8 голосов
/ 27 августа 2010

Пока ваш запрос возвращает только один результат, вы можете вызывать 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 (который все равно выдаст исключение, если вы получите более одного результата) или FirstOrDefault.

1 голос
/ 27 августа 2010

В дополнение к ответу Джастина вы можете разрешить возврат 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.

1 голос
/ 27 августа 2010

Вы можете перебирать каждый элемент в запросе, а затем вызывать метод с помощью вашего перечислителя.

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