是Linq还是Lambda?


105

我知道这是Linq:

var _Results = from item in _List
                where item.Value == 1
                select item;

我知道这是Lambda:

var _Results = _List.Where(x => x.Value == 1);

编者注:以上不仅是Lambda,还在于使用“方法语法”的Linq,其谓词是Lambda。需要明确的是,以上两个示例都是Linq(我的原始帖子不正确,但是我留下了错误以说明提示问题的困惑)。

但是Linq是Lambda的子集还是什么?

为什么会有两个看似相同的技术?

是否有技术上的理由选择一个?


Answers:


135

这是LINQ(使用查询语法):

var _Results = from item in _List
                where item.Value == 1
                select item;

这也是LINQ(使用方法语法):

var _Results = _List.Where(x => x.Value == 1);

有趣的是,这两种风格最终都会产生完全相同的代码。编译器允许您以自己喜欢的方式表达自己的意愿,从而为您提供服务。

是一个lambda:

x => x.Value == 1

当您选择使用方法语法时,几乎总是在lambda表达式周围看到LINQ。但是LINQlambda是完全不同的两件事,两者都可以单独使用。

更新:正如svick正确指出的那样,具有查询语法的LINQ 也是使用lambda表达式实现的(如前所述,编译器允许您编写查询语法,但实际上将其转换为背后的方法语法)。这只是基于以下事实:这两种风味完全相同,并且行为方式相同(例如,lambda表达式可能会导致创建闭包)。


2
我认为值得一提的是查询语法在后台也使用了lambda。由于关闭,这可能很重要。
svick 2011年

34

两者都是Linq。第二个是使用 Lambdas

Lambda是在第二个示例中作为参数传递给Where函数的内联方法类型的事物。

这两种语法之间的差异纯粹是语法上的。使用方法调用的第二种linq样式是它在后台的工作方式。第一个是为了使用户更友好/更轻松,编译器将其转换为幕后方法调用。尽管对于任何给定查询,它们的工作原理都应该相同,但是当然,与转换为方法样式时相比,编译器可能会为复杂的linq查询选择稍有不同的解释。

此msdn文章可能也很有趣:LINQ查询语法与方法语法。特别相关的是:“通常,我们建议使用查询语法,因为它通常更简单易读;但是方法语法和查询语法之间没有语义上的区别。”


6
就个人而言,我发现方法语法更具可读性-也许是因为我的大多数代码都是“ LINQ to Objects”(LINQ到对象)类。但是,如果您有丰富的SQL经验,也许一开始查询语法可能会更容易理解。
Tom Bushell

@Tom Bushell,甚至JOIN语法?认真吗
杰里·尼克松

@Tom Bushell:我也是。我在MSDN页面上解释了一些内容,大概可以解释为什么他们不愿意仅仅使用方法样式而开发这种语法的原因。我通常只是在做相对基本的事情,而不是联接或其他更复杂的事情(即主要是过滤或一对一的映射操作)。
克里斯(Chris

@Jerry-像Chris一样,到目前为止,我的LINQ工作非常简单。我已经读过,在执行SelectMany,Join或GroupJoin时,通常首选查询语法-我只是不需要做类似的事情-!
Tom Bushell

1
在LINQ to SQL和LINQ to Entities团队内部将“查询语法”称为“理解语法”。
DamienG
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.