我在LinqPad 5中尝试以下代码(特别是5.26.01)
IEnumerable<string> breeds = new List<string>{
"Fantail",
"Lahore",
"Bokhara Trumpeter",
"Rhine Ringbeater",
"Birmingham Roller",
"Pomeranian Pouter",
"Racing Homer",
"Archangel"};
IEnumerable<string> GetAllBreedsContainingLetter_Fluent(IEnumerable<string> breedlist, string letter)
{
return breedlist
.Where(breedname => breedname.Contains(letter.ToUpperInvariant()) || breedname.Contains(letter.ToLowerInvariant()))
.OrderByDescending(breedname => breedname)
.Select(breedname => breedname);
}
IEnumerable<string> GetAllBreedsContainingLetter_Query(IEnumerable<string> breedlist, string letter)
{
return breedlist = from b in breedlist
where (b.Contains(letter.ToUpperInvariant()) || b.Contains(letter.ToLowerInvariant()))
orderby b descending
select b;
}
var breedsFluent = GetAllBreedsContainingLetter_Fluent(breeds, "R");
breedsFluent.Dump();
var breedsQuery = GetAllBreedsContainingLetter_Query(breeds, "R");
breedsQuery.Dump();
我认为这两个函数应该类似,但我注意到Linqpad中的输出有些奇怪。第一个.Dump()
被标识为IEnumerable<String>
;第二个.Dump()
标识为IOrderedEnumerable<String>
。
这是关于我正在运行的查询还是Linqpad的工件?我从谷歌搜索中找不到任何东西。
答案 0 :(得分:2)
在查询语法中,转换是这样的,当你有一个简单的投影(将一个项目投射到自身)时,仅生成一个Select
调用,当那个简单的投影是仅查询中的操作。由于您的查询包含其他操作,因为性能原因,Select
完全被省略。
将查询语法查询正确转换为方法语法将跳过Select
。使用查询语法复制行为的方法需要像第二个查询那样进行简单的投影。