这个LINQ Expression如何工作?
我知道这段代码在做什么,但我不确定语法。 它似乎不符合“标准”格式。 它主要是LINQ吗?
return db.Subjects.SingleOrDefault(s => s.ID == ID);
第一部分是有道理的,但它是括号中我不明白的部分。 如何s
不声明s
情况下使用s
? 我们如何将逻辑放入方法调用中?
第一部分是有道理的,但它是括号中我不明白的部分。
你在这里看到的是一个lambda表达式 。 这是一个非常特殊的匿名代表。
它主要是LINQ吗?
Enumerable.SingleOrDefault
是一个LINQ方法,但lambdas是独立于LINQ的东西; 他们只是让LINQ变得非常友好,否则就会如此。
现在,要获取特定的IEnumerable
返回IEnumerable
中与谓词s => s.ID == ID
匹配的IEnumerable
的唯一实例,否则返回如果没有这样的实例,则返回null
。 如果存在多个此类实例,则会引发exception。 在编译时s => s.ID == ID
被转换为一个完整的委托,它会吃掉Subject
类型的对象,当且仅当s.ID
等于ID
时才返回一个为true
的bool
。
如何
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(),…)。 希望有所帮助。