Как преобразовать синтаксис запроса в синтаксис метода - PullRequest
6 голосов
/ 23 мая 2009

Я дурачусь, пытаясь изучить все входы и выходы 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 Ответ

14 голосов
/ 23 мая 2009

Это на самом деле довольно просто;

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)
                   });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...