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