Question

Le type de retour de ma requête est IEnumerable<XElement>. Comment puis-je convertir les données résultantes au type de XElement? c'est possible? pourrait certains me aide du corps pour comprendre cela.

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

I doivent passer ResQ en tant que paramètre pour la fonction ci-dessous. afin de le faire que je dois convertir ResQ type XElement.

Database.usp_InsertTestNQuestions(tid, qId, qstn, ans, resQ ); 
Était-ce utile?

La solution

Tant que votre requête renvoie un seul résultat, vous pouvez appeler unique () ou First () sur le résultat (aussi, il n'y a pas besoin de la syntaxe de requête supplémentaire en haut):

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

Si vous voulez gérer le cas où aucun résultat sont renvoyés pour la requête sans lancer une exception, vous pouvez utiliser SingleOrDefault (qui répondront encore une exception si vous obtenez plus d'un résultat) ou FirstOrDefault.

Autres conseils

En plus de la réponse de Justin, vous voudrez peut-être permettre 0 éléments retournés ou une autre condition.

Dans ce cas, il suffit de faire un:

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

La plupart du temps, je trouve qu'il est préférable de ne pas jeter un error-- à moins d'avoir exactement 1 retour est vraiment important.

Vous pouvez itérer sur chaque élément dans la requête, puis appeler la méthode avec votre recenseur.

resQ.ToList().ForEach(e => ...func... );
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top