LINQ查询语法转换为Lambda

9

想知道是否有办法获取由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,但最好能在不使用第三方工具的情况下完成。
3个回答

5

只需执行以下操作:

string lambdaSyntax = query.Expression.ToString();

与LINQPad相比的缺点是结果的格式化全部在一行。

这将产生与使用反射器在您的程序集上找到的结果类似的结果。所有针对具有疯狂命名的匿名类型的静态方法调用。并不理想。 - andleer
它比Reflector中看到的更好 - 而且如果没有第三方工具,它就是最好的。 - Joe Albahari
喜欢你的书。我为团队成员买了几本副本。 - andleer
我相信从一些测试中得出的结论是,您需要确保查询是“Queryable”。如果需要,您可以通过将.AsQueryable()添加到第一个可枚举对象来实现这一点。 - Chris

3
你可以尝试编译汇编代码并使用Reflector查看它。
不过这可能比你想象的要复杂一些,因为编译器会将所有内容编译成直接方法调用(所有调用都是静态方法调用,而不是扩展方法,并且lambda表达式将被编译为自己的函数,通常称为b_88f)。
不过你肯定能理解发生了什么 :-)

Reflector是一个非常棒的工具!它的加分之处在于,你可以使用它来查看几乎任何.NET程序集的.NET代码。 - Chris Brandsma

2

ReSharper有这个功能。只需按一下键,它就可以将LINQ转换为Lambda表达式,反之亦然。此外,它对其他事情也非常(非常)有用。


真的在尽力避免使用第三方工具。 - andleer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接