为什么我从类似的 Linq 查询中得到不同的输出?

Why do I get a different output from analogous Linq queries?

我正在 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 的产物?我还没有从谷歌搜索中找到任何东西。

在查询语法中,转换是这样的,当您有一个普通投影(将项目投影到自身)时,它 在该普通投影时生成一个 Select 调用是查询中的 only 操作。由于您的查询包含其他操作,出于性能原因,Select 被完全省略。

将该查询语法查询正确转换为方法语法将跳过 Select。使用查询语法复制行为的方法需要类似第二个查询的方法来进行简单的投影。