如何将查询语法转换为方法语法

Mat*_*t H 6 .net c# linq linq-to-xml

我正在努力学习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)
               };
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 14

它实际上非常简单;

from entry in A
where B
Run Code Online (Sandbox Code Playgroud)

将(字面意思)翻译为:

A.Where(entry=>B)
Run Code Online (Sandbox Code Playgroud)

和:

select C
Run Code Online (Sandbox Code Playgroud)

直接翻译(以"条目"作为我们的上下文):

.Select(entry=>C)
Run Code Online (Sandbox Code Playgroud)

(除非是什么时候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)
                   });
Run Code Online (Sandbox Code Playgroud)