2010-04-14 6 views
0

Bon, un peu une question étrange; J'ai fait un peu de linq au travail de XML récemment (voir mes autres messages récents here et here).C# linq à xml requête dynamique

Fondamentalement, je veux être en mesure de créer une requête qui vérifie si une zone de texte est nul avant sa valeur est comprise dans la requête, comme suit:

XDocument db = XDocument.Load(xmlPath); 
var query = (from vals in db.Descendants("Customer") 
      where (if(textbox1.Text != "") {vals.Element("CustomerID") == Convert.ToInt32(textbox1.Text) } || 
        if(textbox2.Text != "") {vals.Element("Name") == textbox2.Text}) 
      select vals).ToList(); 

Répondre

1

Il suffit d'utiliser les opérateurs booléens normaux & & et ||:

XDocument db = XDocument.Load(xmlPath); 
var query = (from vals in db.Descendants("Customer") 
      where (textbox1.Text != "" && 
       vals.Element("CustomerID") == Convert.ToInt32(textbox1.Text)) || 
       (textbox2.Text != "" && vals.Element("Name") == textbox2.Text) 
      select vals).ToList(); 

C'est juste une traduction directe du code original - mais je pense que vous aurez besoin d'un casting de vals.Element("CustomerID") à int, et vous ne voulez pas vraiment convertir textbox1.Text à chaque itération, je suis sûr. Vous devez également convertir le "nom" XElement en une chaîne. Que diriez-vous ceci:

int? customerId = null; 
if (textbox1.Text != "") 
{ 
    customerId = int.Parse(textbox1.Text); 
} 

XDocument db = XDocument.Load(xmlPath); 
var query = (from vals in db.Descendants("Customer") 
      where (customerId != null && 
       (int) vals.Element("CustomerID") == customerId) || 
       (textbox2.Text != "" && 
       (string) vals.Element("Name") == textbox2.Text) 
      select vals).ToList(); 

Sinon, vous pouvez séparer les deux parties de la requête et « union » les résultats ensemble. Ou - de préférence IMO - vous pouvez construire la requête plus dynamiquement:

var query = db.Descendants("Customer"); 
if (textbox1.Text != null) 
{ 
    int customerId = int.Parse(textbox1.Text); 
    query = query.Where(x => (int) x.Element("CustomerID") == customerId); 
} 

if (textbox2.Text != null) 
{ 
    query = query.Where(x => (string) x.Element("Name") == textbox2.Text); 
} 
List<XElement> results = query.ToList(); 
+0

Fantastique encore Jon. J'ai déjà traité les valeurs comme vous l'avez mentionné dans la deuxième option, en utilisant simplement le code ci-dessus pour rendre les choses plus simples. Encore merci beaucoup! –