return db.Orders.Where(o => o.Customer == User.Identity.Name);
o
来自哪里?有时我看到这个表单与c
等其他字母一起使用?
这可以交换吗?
User.Identity.Name
来自哪里?
答案 0 :(得分:4)
o来自哪里?
Where
接受一个Func
委托,该委托接受您正在使用的任何集合类型的实例。在这种情况下,它将是Func<Order, bool>
。您的Lambda语句声明一个与委托匹配的匿名函数。 o
只是Order
输入。您可以随意命名。如果你用长手写出这个函数,它看起来像是:
public bool AnonymousFunction(Order o)
{
return o.Customer == User.Identity.Name;
}
如果您使用LINQ to Objects进行查询,则会为每个元素调用此委托,以查找集合中匹配的元素。如果您正在查询LINQ to SQL(或其他一些查询提供程序),您的委托将转换为表达式树,用于生成实际的查询语法。
User.Identity.Name来自哪里?
我假设您在某种Web应用程序中,而User.Identity正在从Forms身份验证令牌中提取登录的用户信息。
答案 1 :(得分:2)
=>
运算符用于定义 lambda语句 - 本质上是一个内联函数。它的内联等价于:
public bool Myfunc(Order o)
{
return o.Customer == User.Identity.Name;
}
o
的类型是从传递给Func
的{{1}}的参数类型推断出来的。在这种情况下,类型将为Where
,因为Order
将IEnumerable<Order>.Where()
作为输入Func<Order, bool>
,输出Order
。
实际的字母并不重要。一个好的约定是使用与源类型相关的标识符,因此bool
或o
将是不错的选择。
order
可能是函数所在类的属性(即User
),Page
是与用户关联的标识的名称。
答案 2 :(得分:1)
通过使用lambda表达式,您可以编写可以作为参数传递或作为函数调用的值返回的本地函数。
在您的情况下,您正在使用
db.Orders.Where(o => o.Customer == User.Identity.Name);
代替o
,您可以使用您想要的任何字符,并且该字符将表现为集合类型的实例,即。在这里,您使用的是Orders
的集合,因此o
将表现为Order
类的实例。
答案 3 :(得分:0)
提供的所有答案都是正确的。我只想用简单的语言解释一下你的陈述:
您正在通过撰写db.Orders
来访问订单表
然后,您使用Where
在Where
内,您可以指定条件。这是使用lambda表达式完成的。 Lambda表达式只不过是一种说法,我将每一行称为o(或者可以是任何东西,它可以是x,y,abc,任何东西,它只是一个名称)以及那个(=&gt;)检查如果o.Customer等于当前登录用户。
如果是,请将符合此条件的所有行返回给我。