这个LINQ Expression如何工作?

5 .net c# linq linq-to-sql

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

return db.Subjects.SingleOrDefault(s => s.ID == ID);
Run Code Online (Sandbox Code Playgroud)

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

jas*_*son 16

第一部分是有道理的,但它是我不理解的括号中的部分.

你在这里看到的是一个lambda表达式.这是一个非常特殊的匿名代表.

它主要是LINQ吗?

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

现在,为了得到具体IEnumerable<Subject>.SingleOrDefault(s => s.ID == ID)的回报的唯一实例SubjectIEnumerable<Subject>谓词匹配s => s.ID == ID或返回null,如果没有这样的例子.如果存在多个此类实例,则会引发异常.在编译时s => s.ID == ID被翻译成完全成熟的委托类型的吃对象Subject,并返回一个booltrue当且仅当s.ID是等于ID.

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

=>lambda运算符.它基本上将lambda表达式的左侧与右侧分开.左侧是输入变量.它等同于显式定义方法中的参数列表.那是s在lambda表达式中起到以下作用s:

public bool Predicate(Subject s)
Run Code Online (Sandbox Code Playgroud)

只是你不必声明s编译器会推断它的类型.

右边是lambda身体.它相当于下面的身体

public bool Predicate(Subject s) {
    return s.ID == ID;
}
Run Code Online (Sandbox Code Playgroud)

更重要的是,您不必声明返回类型; 编译器会推断出来.

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

class MyPredicate {
    public string ID;
    public bool Predicate(Subject s) {
        return s.ID == this.ID;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

// elements is IEnumerable<Subject>
// ID is string
MyPredicate predicate = new MyPredicate();
predicate.ID = ID;
elements.SingleOrDefault(predicate.Predicate);
Run Code Online (Sandbox Code Playgroud)

好的一点是编译器在你使用lambda表达式时会自动为你调出这个.


Ref*_*din 5

它被称为Lambda表达式.请看这里的解释. Lambda表达式(C#编程指南)


cod*_*zen 5

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

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

return db.Subjects.SingleOrDefault(delegate(s) { return s.ID == ID }); 
Run Code Online (Sandbox Code Playgroud)

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