这个LINQ Expression如何工作?

时间:2010-01-21 03:06:05

标签: c# .net linq linq-to-sql

我知道这段代码在做什么,但我不确定语法。它似乎不符合“标准”格式。它主要是LINQ吗?

return db.Subjects.SingleOrDefault(s => s.ID == ID);

第一部分是有道理的,但它是括号中我不明白的部分。我们如何在不声明的情况下使用s?我们如何将逻辑放入方法调用中?

6 个答案:

答案 0 :(得分:16)

  

第一部分是有道理的,但它是括号中我不明白的部分。

你在这里看到的是lambda expression。这是一个非常特殊的匿名代表。

  

主要是LINQ吗?

Enumerable.SingleOrDefault是一个LINQ方法,但lambda是独立于LINQ的东西;他们只是让LINQ变得非常友好,否则就会如此。

现在,要获取特定IEnumerable<Subject>.SingleOrDefault(s => s.ID == ID),请在Subject中返回与谓词IEnumerable<Subject>匹配的唯一s => s.ID == ID实例,否则返回null没有这样的例子。如果存在多个此类实例,则会引发异常。在编译时,s => s.ID == ID被翻译成一个完整的委托,吃掉Subject类型的对象,并返回bool true当且仅当s.ID }等于ID

  

我们如何在不声明的情况下使用s

=>lambda operator。它基本上将lambda表达式的左侧与右侧分开。左侧是输入变量。它等同于显式定义方法中的参数列表。这是lambda表达式中的s,其作用如下s

public bool Predicate(Subject s)

只是你不必声明s的类型,因为编译器会推断它。

右手边的lambda身体。它相当于下面的主体

public bool Predicate(Subject s) {
    return s.ID == ID;
}

更重要的是,您不必声明返回类型;编译器会将其推断为。

所以,最后就好像你做了以下事情:

class MyPredicate {
    public string ID;
    public bool Predicate(Subject s) {
        return s.ID == this.ID;
    }
}

然后:

// elements is IEnumerable<Subject>
// ID is string
MyPredicate predicate = new MyPredicate();
predicate.ID = ID;
elements.SingleOrDefault(predicate.Predicate);

好处是编译器在你使用lambda表达式时会自动为你吐出来。

答案 1 :(得分:5)

它被称为Lambda Expression。请看这里的解释。 Lambda Expressions (C# Programming Guide)

答案 2 :(得分:5)

这是C#3.0编译器为你工作的一些魔力。

该语句被编译成一个委托,相当于:

return db.Subjects.SingleOrDefault(delegate(s) { return s.ID == ID }); 

它被称为lambda表达式,因为您不需要正式声明参数,它们是由C#编译器推断的。

答案 3 :(得分:4)

我认为你的困惑在于s => s.ID== ID这个词。这是一个lambda表达式。简单来说,这是一种定义内联函数的方法。

在这种情况下,=>左侧的文本是参数列表。因此,s凭借其在其中的位置而被宣布。 =>的右侧是执行的表达式。在这个特定的上下文中,lambda将在集合中的每个元素上运行,代码将声明有一个值满足lambda执行的表达式。

答案 4 :(得分:0)

答案 5 :(得分:0)

s before =&gt;声明一个变量,其结构元素的类型(Subjects变量中包含的类型编辑:其他函数适用于更多参数,即。Join ),它位于右侧部分(在=>&gt;之后)。逻辑来自功能。如果调用SingleOrDefault(在docs中查找),如果满足条件或NULL,它将返回SINGLE元素。 LINQ中有许多函数可以使用(即First(),Where(),...)。希望有所帮助。