【问题标题】:How to convert query syntax to method syntax如何将查询语法转换为方法语法
【发布时间】:2009-05-22 20:17:45
【问题描述】:

我在胡闹试图了解 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)
               };

【问题讨论】:

  • 有关信息,“C# 深度”后面的章节详细介绍了这个领域。
  • C# 3.0 规范在 Internet 上提供;它非常详细地描述了句法转换规则。

标签: c# .net linq linq-to-xml


【解决方案1】:

其实很简单;

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

【讨论】:

  • +1 是一个很好、干净的答案,解释了原理,而不仅仅是具体示例的解决方案。
  • Bart De Smet 写了一个方便的翻译cheat sheet 在方法和查询语法之间切换。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 2021-08-04
相关资源
最近更新 更多