2009-05-22 5 views
6

Je suis dupe essayer d'apprendre les ins IN de LINQ. Je veux convertir la requête suivante (qui fonctionne correctement) de la syntaxe de la requête à la syntaxe de la méthode, mais je n'arrive pas à l'obtenir correctement. Quelqu'un peut-il me montrer la bonne façon d'accomplir cela?Comment faire pour convertir la syntaxe de la requête à la syntaxe de la méthode

var logQuery = from entry in xDoc.Descendants("logentry") 
       where (entry.Element("author").Value.ToLower().Contains(matchText) || 
         entry.Element("msg").Value.ToLower().Contains(matchText) || 
         entry.Element("paths").Value.ToLower().Contains(matchText) || 
         entry.Element("revision").Value.ToLower().Contains(matchText)) 
       select new 
       { 
        Revision = entry.Attribute("revision").Value, 
        Author = entry.Element("author").Value, 
        CR = LogFormatter.FormatCR(entry.Element("msg").Value), 
        Date = LogFormatter.FormatDate(entry.Element("date").Value), 
        Message = LogFormatter.FormatComment(entry.Element("msg").Value), 
        ET = LogFormatter.FormatET(entry.Element("msg").Value), 
        MergeFrom = LogFormatter.FormatMergeFrom(entry.Element("msg").Value), 
        MergeTo = LogFormatter.FormatMergeTo(entry.Element("msg").Value) 
       }; 
+1

Pour info, les derniers chapitres dans « C# en profondeur » couvrent ce domaine glorieux détail . –

+0

La spécification C# 3.0 est disponible sur Internet; il décrit les règles de transformation syntaxique dans les moindres détails. –

Répondre

14

C'est en fait assez simple;

from entry in A 
where B 

translatées (littéralement) à:

A.Where(entry=>B) 

et:

select C 

se traduit directement (avec "entrée" comme notre contexte):

.Select(entry=>C) 

(sauf quand il serait entry=>entry, que le compilateur omet pour les cas non trivial)

donc juste injecter ceux-ci et vous avez terminé:

var logQuery = xDoc.Descendants("logentry") 
       .Where(entry=> 
          entry.Element("author").Value.ToLower().Contains(matchText) || 
          entry.Element("msg").Value.ToLower().Contains(matchText) || 
          entry.Element("paths").Value.ToLower().Contains(matchText) || 
          entry.Element("revision").Value.ToLower().Contains(matchText)) 
       .Select(entry=>new 
        { 
         Revision = entry.Attribute("revision").Value, 
         Author = entry.Element("author").Value, 
         CR = LogFormatter.FormatCR(entry.Element("msg").Value), 
         Date = LogFormatter.FormatDate(entry.Element("date").Value), 
         Message = LogFormatter.FormatComment(entry.Element("msg").Value), 
         ET = LogFormatter.FormatET(entry.Element("msg").Value), 
         MergeFrom = LogFormatter.FormatMergeFrom(entry.Element("msg").Value), 
         MergeTo = LogFormatter.FormatMergeTo(entry.Element("msg").Value) 
        }); 
+0

Nice - merci pour la réponse rapide. –

+0

+1 pour une réponse agréable et claire expliquant le principe plutôt qu'une simple solution à l'exemple spécifique. – BitMask777

+1

Bart De Smet a écrit une traduction pratique [feuille de triche] (http://bartdesmet.net/blogs/bart/archive/2008/08/30/c-3-0-query-expression-translation-cheat-sheet.aspx) pour aller entre la méthode et la syntaxe de requête. – oillio

Questions connexes