2009-05-22 15 views
6

Oszukuję, próbując poznać tajniki LINQ. Chcę przekonwertować następującą kwerendę (która działa poprawnie) od składni zapytania do składni metody, ale wydaje mi się, że nie jest to właściwe. Czy ktoś może mi pokazać, w jaki sposób to osiągnąć?Jak przekonwertować składnię zapytania na składnię metody?

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

Dla informacji, późniejsze rozdziały w „C# In Depth” zasłaniać tego obszaru w chwalebnej szczegółowo . –

+0

Specyfikacja C# 3.0 jest dostępna w Internecie; opisuje szczegółowo zasady transformacji syntaktycznej. –

Odpowiedz

14

Jest to całkiem proste;

from entry in A 
where B 

przekłada (dosłownie) do:

A.Where(entry=>B) 

oraz:

select C 

przekłada się bezpośrednio do (z "wejściem" jako naszym kontekście):

.Select(entry=>C) 

(z wyjątkiem tego, kiedy będzie to entry=>entry, który kompilator pomija dla nietrywialnych przypadków)

więc po prostu wstrzyknąć te i gotowe:

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 - dzięki za szybką odpowiedź. –

+0

+1 za miłą, czystą odpowiedź wyjaśniającą zasadę, a nie tylko rozwiązanie konkretnego przykładu. – BitMask777

+1

Bart De Smet napisał wygodne tłumaczenie [cheat sheet] (http://bartdesmet.net/blogs/bart/archive/2008/08/30/c-3-0-query-expression-translation-cheat-sheet.aspx), aby przejść między składnią metody i zapytania. – oillio

Powiązane problemy