2009-05-22 109 views
6

我在嘗試學習LINQ的缺點。我想將下面的查詢(這是正常工作)從查詢語法轉換爲方法語法,但我似乎無法做到正確。任何人都可以告訴我正確的方法來實現這一點嗎?如何將查詢語法轉換爲方法語法

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

對於信息,在後面的章節中的「C#中的深度」涵蓋這方面的光彩細緻。 – 2009-05-22 20:26:12

+0

C#3.0規範在互聯網上可用;它詳細描述了語法轉換規則。 – 2009-05-22 20:50:55

回答

14

它實際上很簡單;

from entry in A 
where B 

翻譯(直譯)到:

A.Where(entry=>B) 

和:

select C 

直接轉化爲(以 「項」 爲背景):

.Select(entry=>C) 

(除非它是entry=>entry,該編譯器省略了不平凡的情況下)

所以剛注入的,就大功告成了:

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) 
        }); 
相關問題