这个LINQ Expression如何工作?

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

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

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

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

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

它主要是LINQ吗?

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

现在,要获取特定的IEnumerable.SingleOrDefault(s => s.ID == ID)返回IEnumerable中与谓词s => s.ID == ID匹配的IEnumerable的唯一实例,否则返回如果没有这样的实例,则返回null 。 如果存在多个此类实例,则会引发exception。 在编译时s => s.ID == ID被转换为一个完整的委托,它会吃掉Subject类型的对象,当且仅当s.ID等于ID时才返回一个为truebool

如何s不声明s情况下使用s

=>是lambda运算符 。 它基本上将lambda表达式的左侧与右侧分开。 左侧是输入变量。 它等同于显式定义的方法中的参数列表。 那就是lambda表达式中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 // ID is string MyPredicate predicate = new MyPredicate(); predicate.ID = ID; elements.SingleOrDefault(predicate.Predicate); 

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

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

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

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

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

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

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

在这种情况下, =>左侧的文本是参数列表。 所以s因为处于它的位置而被宣布。 =>的右边是执行的表达式。 在这个特定的上下文中,lambda将在集合中的每个元素上运行,代码将断言有一个值满足lambda执行的表达式。

这是一个Lambda表达式 。

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