2009-05-22 3 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# в глубине» покрывают эту область в славных подробно , –

+0

Спецификация C# 3.0 доступна в Интернете; он описывает правила синтаксического преобразования очень подробно. –

ответ

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) 
        }); 
+0

Nice - спасибо за быстрый ответ. –

+0

+1 для приятного, чистого ответа, объясняющего принцип, а не просто решение конкретного примера. – BitMask777

+1

Bart De Smet написал удобный перевод [чит-лист] (http://bartdesmet.net/blogs/bart/archive/2008/08/30/c-3-0-query-expression-translation-cheat-sheet.aspx) для перехода между методом и синтаксисом запроса. – oillio