2010-11-08 4 views
0

Le code suivant doit renvoyer tous les codes-barres qui sont dans le filtre. cependant, il semble exécuter le filtre uniquement sur le premier nouvel enregistrement.O WH EN CLAUSE pour LINQ to XML

le xml contient 5 nouveaux enregistrements avec un sous-élément de code à barres allant de 1 à 5. Si le filtre contient 1,3 et 4, il renvoie 1 et si le filtre contient 2,3 et 4, il renvoie un aucun enregistrement.

La configuration actuelle (rpa.XMLData.Elements ("NEWFILE"). Elements ("NEWRECORD")) renvoie 5 lignes. J'ai essayé de voir ce qui se passe si je change cela pour revenir en une seule ligne (rpa.XMLData.Elements ("NEWFILE")) mais cela fait la même chose en me renvoyant 1 résultat étant le premier coup, en ignorant 3 et 4.

Y a-t-il un moyen de changer cette déclaration LINQ pour réellement regarder à travers tous les codes à barres?

edit: l'information provient d'un test atm donc désolé si ça a l'air un peu bizarre. J'ai ajouté des informations sur le xml et le filtre.

aussi, j'ai trouvé quelque chose en plus sur le problème si le filtre

contient 1,2,3 cela fonctionne. filtre contient 1,2,4 il reviendra 1 et 2 pas 4.

il semble se casser une fois qu'il ne peut pas trouver une solution.

String string2Stream = String.Concat("2", Environment.NewLine, "3", Environment.NewLine, "4", Environment.NewLine, "End"); 
     Stream reader = new MemoryStream(ASCIIEncoding.Default.GetBytes(string2Stream)); 
    StreamReader read = new StreamReader(reader); 
    var filter = Enumerable.Where(StreamReaderToSeq(read), x => { int temp; return int.TryParse(x, out temp); }); 


    var query = from p in rpa.XMLData.Elements("NEWFILE").Elements("NEWRECORD") 
       where filter.Contains(p.Element("BAR_CODE").Value) 
       select new { p.Element("BAR_CODE").Value }; 

Sous le xml j'ai supprimé beaucoup de choses supplémentaires qui ne devraient pas être liées.

<?xml version=\"1.0\"?> 
<NEWFILE> 

<NEWRECORD num=\"1\"><MAILSORT></MAILSORT><BAR_CODE>1</BAR_CODE> 
</NEWRECORD> 

<NEWRECORD num=\"2\"><MAILSORT></MAILSORT><BAR_CODE>2</BAR_CODE> 
</NEWRECORD> 

<NEWRECORD num=\"3\"><MAILSORT></MAILSORT><BAR_CODE>3</BAR_CODE> 
</NEWRECORD> 

<NEWRECORD num=\"4\"><MAILSORT></MAILSORT><BAR_CODE>4</BAR_CODE> 
</NEWRECORD> 

<NEWRECORD num=\"5\"><MAILSORT></MAILSORT><BAR_CODE>5</BAR_CODE> 
</NEWRECORD> 

</NEWFILE> 
+2

S'il vous plaît montrer un court mais complet exemple - nous ne pouvons pas voir le XML ou comment vous construisez « filtre » pour le moment. –

Répondre

1
var filter = new List<string> {"1", "2", "4"}; 

var query = from p in barcode.Descendants("BAR_CODE") 
      where filter.Contains(p.Value) 
      select p.Value; 

Je ne savais pas où vous alliez avec le filtre que vous avez créé, mais je pense que cela est une question assez sûr. C'est pratique car cela fonctionne même si BAR_CODE est vide.

+0

il semble que mon cas a un problème avec le flux. Si j'utilise votre liste, cela fonctionne parfaitement. peut-être que j'ai besoin de voir si je peux obtenir le lecteur de flux à un LISTE. – Andy

0

En guise de réponse alternative, This montre comment le faire fonctionner sans contenir mais en conservant le flux.

converti en mon code cela fonctionne aussi. Mais pourquoi les Contient semblent-ils casser si l'un échoue alors que cela fonctionne bien si vous remplacez le flux par une Liste ou si vous remplacez le Contains par un JOIN. Quelqu'un connaît-il la réponse?

 var query = from p in rpa.XMLData.Elements("NEWFILE").Elements("NEWRECORD") 
       join f in filter on 
        p.Element("BAR_CODE").Value equals f.ToString()      
       select p; 

ou

 var projectsMemberWorkedOn = 
        rpa.XMLData.Elements("NEWFILE").Elements("NEWRECORD") 
        .Join(filter, p => p.Element("BAR_CODE").Value, f => f.ToString(), 
         (p, f) => new { p, f }) 
         .Select(@t => @t.p);