2009-04-16 12 views
0

est-il une meilleure façon de faire ce genre de chose:LINQ to XML Question Débutant

var filter = new CashFilters(); 
var element = XElement.Parse(request.OuterXml); 

var productId = element.Elements("ProductId").Select(el => el); 

if (productId.Count() == 1) 
    filter.ProductId = Convert.ToInt32(productId.Single().Value); 

Répondre

2

Eh bien, le Select(el => el) ne vous fait rien de bon pour commencer.

Je vous suggère d'utiliser SingleOrDefault:

var productId = element.Elements("ProductId").SingleOrDefault(); 
if (productId != null) 
    filter.ProductId = Convert.ToInt32(productId.Value); 

Notez que qui gère le cas où il n'y a pas éléments ProductID, mais jetteront une exception s'il y a plus d'un . Si c'est un cas valide, votre code actuel (sans l'appel Select redondant) est raisonnable.

EDIT: Vous pourrait sortir de cela avec:

var productId = element.Elements("ProductId") 
         .Select(elt => elt.Value) 
         .SingleOrDefault(); 
filter.ProductId = Convert.ToInt32(productId ?? filter.ProductId.ToString()); 

Mais c'est assez horrible;)

Fondamentalement, vous avez une condition - que vous voulez seulement régler la ProductId si elle est spécifié. Un « si » est la manière généralement acceptée de l'exécution du code conditionnel :)

Il existe des alternatives:

filter.ProductId = productId == null 
        ? filter.ProductId 
        : int.Parse(productId); 

Si vous ne me dérange pas filter.ProductId être mis à 0 s'il n'y a pas ID spécifié, vous peut simplement utiliser:

filter.ProductId = Convert.ToInt32(element.Elements("ProductId") 
              .Select(elt => elt.Value) 
              .SingleOrDefault()); 

(en raison de la façon dont Convert.ToInt32 renvoie 0 lorsqu'il est passé un argument nul.)

+0

donc il n'y a aucun moyen d'obtenir le tour de la vérification nulle? grand livre par la façon :) – AwkwardCoder

1

Avez-vous vraiment n EED à faire cela dans Linq Xml? L'approche DOM Xml me semble beaucoup plus raisonnable.

Avez-vous envisagé l'approche Xml pur?

XmlDocument doc = new XmlDocument(); 
    doc.LoadXml(request.OuterXml); 

    var node = doc.SelectSingleNode("//ProductId[1]"); 
    if (node != null) 
     filter.ProductId = Convert.ToInt32(node.InnerText); 
+1

Personnellement, je préfère l'approche LINQ à XML - moins de trucs chaîne effrayant (non compilé) pour se tromper. Simplement en utilisant Elements ("ProductId") SingleOrDefault() fait la même chose que l'expression XPath, mais avec moins de savoir IMO. –