Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将查询语法转换为方法语法_C#_.net_Linq_Linq To Xml - Fatal编程技术网

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

C# 如何将查询语法转换为方法语法,c#,.net,linq,linq-to-xml,C#,.net,Linq,Linq To Xml,我在胡闹,想了解林克的来龙去脉。我想将下面的查询(工作正常)从查询语法转换为方法语法,但似乎无法正确执行。有人能告诉我实现这一目标的正确方法吗 var logQuery = from entry in xDoc.Descendants("logentry") where (entry.Element("author").Value.ToLower().Contains(matchText) || entry.Element

我在胡闹,想了解林克的来龙去脉。我想将下面的查询(工作正常)从查询语法转换为方法语法,但似乎无法正确执行。有人能告诉我实现这一目标的正确方法吗

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

其实很简单,

from entry in A
where B
翻译(字面意思)为:

以及:

直接翻译为(以“条目”作为上下文):

(除了当它是
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)
                   });

关于信息,后面的“C#Depth”章节详细介绍了这一领域;它非常详细地描述了语法转换规则。+1给出了一个漂亮、清晰的答案,解释了原理,而不仅仅是具体示例的解决方案。Bart De Smet编写了一个方便的翻译,在方法和查询语法之间进行转换。
select C
.Select(entry=>C)
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)
                   });