ASP.NET Entity Framework DB查询语法

时间:2014-01-22 21:19:06

标签: c# asp.net entity-framework

return db.Orders.Where(o => o.Customer == User.Identity.Name);

o来自哪里?有时我看到这个表单与c等其他字母一起使用? 这可以交换吗? User.Identity.Name来自哪里?

4 个答案:

答案 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,因为OrderIEnumerable<Order>.Where()作为输入Func<Order, bool>,输出Order

实际的字母并不重要。一个好的约定是使用与源类型相关的标识符,因此boolo将是不错的选择。

order可能是函数所在类的属性(即User),Page是与用户关联的标识的名称。

答案 2 :(得分:1)

这称为Lambda Expression

  

通过使用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等于当前登录用户。

如果是,请将符合此条件的所有行返回给我。