【问题标题】:LINQ Query Syntax to Lambda到 Lambda 的 LINQ 查询语法
【发布时间】:2009-04-29 21:06:39
【问题描述】:

想知道是否有任何方法可以获取由 LINQ“查询”语法表达式产生的 lambda 表达式。

给定:

var query = from c in dc.Colors
            where c.ID == 213
            orderby c.Name, c.Description
            select new {c.ID, c.Name, c.Description };

有什么方法可以获取生成的“lambda”代码/表达式?

var query = dc.Colors
    .Where(c => c.ID == 213)
    .OrderBy(c => c.Name)
    .ThenBy(c => c.Description)
    .Select(c => new {c.ID, c.Name, c.Description, });

我知道这些都是非常简单的示例,并且 C# 编译器在编译代码时会从查询表达式生成 lambda 表达式。有没有办法得到那个表达式的副本?

我希望将其用作一些对 lambda 表达式不太熟悉的团队成员的培训工具。另外,我使用过 Linq Pad,但理想情况下,这可以在没有 3rd 方工具的情况下完成。

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    去吧:

    string lambdaSyntax = query.Expression.ToString();
    

    与 LINQPad 相比的缺点是结果被格式化为一行。

    【讨论】:

    • 这会产生与在您的程序集中使用 Reflector 的结果相似的结果。所有静态方法调用都针对疯狂的命名匿名类型。不理想。
    • 它比您在 Reflector 中看到的要好 - 与您在没有第三方工具的情况下获得的一样好。
    • 爱你的书。我为团队成员买了几本。
    • 我相信从一些测试中你需要确保查询是Queryable。如果需要,您可以通过将 .AsQueryable() 添加到第一个可枚举来做到这一点。
    【解决方案2】:

    您可以尝试编译程序集,然后使用 Reflector 查看它。

    这可能比你想的要复杂一些,因为编译器会将事情直接编译到直接方法调用(一切都将是静态方法调用,而不是扩展方法,并且 lambdas 将被编译成它们自己的函数通常称为<ClassName>b_88f)

    你肯定会弄清楚发生了什么:-)

    【讨论】:

    • Reflector 是一个很棒的工具!奖励积分,因为您可以使用它来查看几乎任何 .net 程序集的 .net 代码。
    【解决方案3】:

    ReSharper 具有该功能。它需要一个 LINQ 到 Lambda,然后按一下键再返回。对其他事情也非常(非常)有用。

    【讨论】:

    • 真的尽量避免使用第三方工具。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多