2011-08-08 5 views
0

Je veux utiliser cette requête:cette requête Linq

var queryData = from va in xdoc.Descendants("language") 
       select new 
       { 
        StringID = va.Parent.Parent.Attribute("id").Value, 
        Language = va.Attribute("name").Value, 
        LanguageData = va.Element("value").Value, 
       }; 

var organizedData = from x in queryData 
        group x by x.StringID into xg 
        select new 
        { 
         StringID = xg.Key, 
         English = xg.SingleOrDefault(x => x.Language == "ENGLISH_US").LanguageData, 
         Custom = xg.SingleOrDefault(x => x.Language == languageBox.SelectedItem.ToString()).LanguageData, 
        }; 

mainView.DataSource = organizedData.ToList(); 
mainView.Refresh(); 

sauf que comme une condition supplémentaire pour ce qui est récupéré pour le Custom type anonyme, sa valeur doit être égale à "*". Pourquoi ne puis-je pas comprendre cela? Je suppose que je ne connais pas assez les types anonymes ou l'opérateur =>.

+0

Les virgules finales finales dans les instructions 'select new {' sont-elles valides? Deviner c'est juste deux erreurs de pâte de copie parce que je ne pense pas qu'il compilerait. –

+0

Il compile bien, mais ils ne sont pas nécessaires. –

Répondre

3

Est-ce ce que vous voulez?

mainView.DataSource = organizedData.Where(x => x.Custom == "*").ToList(); 
+0

Incroyable. Oui merci. La fonction '.Where' - je vois maintenant son bon usage. –

+0

Cela fonctionne bien, mais il est plus lisible de mettre la clause Where à droite dans la requête linq. Et c'est tout le point de linq: P –

2

Je pense que c'est ce que vous cherchez. Je mets la valeur dans une variable temp donc il ne doit pas être calculé deux fois.

 var organizedData = from x in queryData 
          group x by x.StringID into xg 
          let temp = xg.SingleOrDefault(x => x.Language == languageBox.SelectedItem.ToString()).LanguageData 
          where temp == "*" 
          select new 
          { 
           StringID = xg.Key, 
           English = xg.SingleOrDefault(x => x.Language == "ENGLISH_US").LanguageData, 
           Custom = temp, 
          }; 
+1

vous utilisez 'xg' avant qu'il ne soit déclaré ... –

+0

@Thomas merci, corrigé –

Questions connexes