4

在 Microsoft 的 MVC 教程 NerdDinners 的这段代码中:

公共类 DinnerRepository {

private NerdDinnerDataContext db = new NerdDinnerDataContext();

//
// Query Methods

public IQueryable<Dinner> FindAllDinners() {
    return db.Dinners;
}

public IQueryable<Dinner> FindUpcomingDinners() {
    return from dinner in db.Dinners
           where dinner.EventDate > DateTime.Now
           orderby dinner.EventDate
           select dinner;
}

public Dinner GetDinner(int id) {
    return db.Dinners.SingleOrDefault(d => d.DinnerID == id);
}

//
// Insert/Delete Methods

public void Add(Dinner dinner) {
    db.Dinners.InsertOnSubmit(dinner);
}

public void Delete(Dinner dinner) {
    db.RSVPs.DeleteAllOnSubmit(dinner.RSVPs);
    db.Dinners.DeleteOnSubmit(dinner);
}

//
// Persistence 

public void Save() {
    db.SubmitChanges();
} 

}

有什么作用:

public Dinner GetDinner(int id) {
    return db.Dinners.SingleOrDefault(d => d.DinnerID == id);
}

“d”是什么意思?这段代码是如何工作的?我知道它会带回与函数参数中的 id 匹配的晚餐。我不明白“d 去...”的意思。我知道这是一个 lambda,但我真的不明白。“d”是干什么用的?它有什么作用?

这是否可以在没有 lambda 的情况下编写(如何)?

4

4 回答 4

5

您可能应该阅读匿名方法

基本上,您所指的代码可以写成没有像这样的 Lamba 语法的匿名方法:

public Dinner GetDinner(int id) {    
   return db.Dinners.SingleOrDefault(delegate (Dinner d) {
                                       return d.DinnerID == id;
                                     });
}
于 2009-05-11T20:38:53.260 回答
2

您需要了解 lambda 语法及其用途。

这是一篇很好地解释它的文章。

但是,为了简短地回答您关于 NerdDinner 上下文的问题,此上下文中的“d”只是传递给作为晚餐对象的 lamda 表达式的参数。

于 2009-05-11T20:25:19.727 回答
2

这也很相似……

from d in db.Dinners
where d.DinnerID == id
select d

代码基本上围绕返回第一个晚餐的晚餐进行循环,如果没有找到则返回默认值。

在这种情况下,示例中使用的命名约定在生产中并不总是合适的。通常使用“d”作为局部变量,选择变量名“dinner”可能更合适,尽管在这种情况下,d 的范围很小,只要你知道,无论哪种方式都很清楚lambda 表达式是如何工作的。

于 2009-05-11T20:28:10.690 回答
0

这段代码:

d => d.DinnerID == id

可以认为是定义类型的函数Func<Dinner, bool>

无论你把它传递给什么,这个函数都可以被调用和传递Dinner,它会返回一个bool.

void Foo(Func<Dinner, bool> f)
{
    bool result = f(new Dinner());
}

在您的真实示例中,该函数SingleOrDefault将多次调用您给它的函数,Dinner每次传递一个不同的函数,并将返回Dinner函数返回的函数true

事实上,当您使用IQueryable时,这只是概念上发生的情况。很有可能,函数的代码被转换成 SQL,所有的执行都在数据库内部完成。

于 2009-05-11T20:40:08.343 回答