Model view controller 简单MVC NerdDinners Lambda

Model view controller 简单MVC NerdDinners Lambda,model-view-controller,lambda,nerddinner,Model View Controller,Lambda,Nerddinner,在这段来自微软MVC教程NerdDinners的代码中: 公共级餐厅{ private NerdDinnerDataContext db = new NerdDinnerDataContext(); // // Query Methods public IQueryable<Dinner> FindAllDinners() { return db.Dinners; } public IQueryable<Dinner> FindUpcomingDinners

在这段来自微软MVC教程NerdDinners的代码中:

公共级餐厅{

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();
} 
“d”是什么意思?这段代码是怎么工作的?我知道它把晚餐带回来,其中dinnerid与函数参数中的id匹配。我不理解“d去…”的意思。我知道它是一个lambda,但我并不真正理解它。“d”是什么意思?它做什么


如果没有lambda的话,这篇文章是否可以写(如何写)?

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

这是一个很好的解释

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

这也类似于

from d in db.Dinners
where d.DinnerID == id
select d
代码基本上围绕晚餐循环,返回第一顿晚餐,如果没有找到,则返回默认晚餐


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

您可能应该继续阅读

基本上,您所引用的代码可以作为匿名方法编写,而不需要lamba语法,如下所示:

public Dinner GetDinner(int id) {    
   return db.Dinners.SingleOrDefault(delegate (Dinner d) {
                                       return d.DinnerID == id;
                                     });
}
这段代码:

d => d.DinnerID == id
可以认为是定义了
Func
类型的函数

无论您将其传递给什么,都可以调用此函数,并将其传递给
Dinner
,它将返回
bool

void Foo(Func<Dinner, bool> f)
{
    bool result = f(new Dinner());
}
void Foo(函数f)
{
bool result=f(新晚餐());
}
在您的实际示例中,函数
SingleOrDefault
将多次调用您提供给它的函数,每次向它传递不同的
Dinner
,并将返回函数返回的
Dinner


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

但是d是如何得到的,以至于它可以引用db dinners的呢?@johnny,因为其中一个SingleOrDefault重载使用的表达式基本上是一个Func,其中T是一个dinner=>运算符的官方符号是把它读作“goes to”,所以这样说实际上是正确的。@womp哦,好吧,不知道,会修改我的答案。我仍然喜欢“这样”我自己,但是whatever=p这篇文章很有帮助。谢谢。但是,d如何成为晚餐对象呢?在文章中:ChangeInt myDelegate=x=>x*2;他说“这个lambda表达式是一个匿名方法,它接受一个参数x,并返回x*2。”在我的上下文中,d是参数,但我没有看到任何东西发送使“d”成为晚餐对象的东西,如文章中所述:Console.WriteLine({0}),myDelegate(5));这里发送了一个5,x变成了5。在我的上下文中,只有“d”,我看不到任何地方“使”d成为晚餐对象。因此,在您的示例中,d变成了“d”db.dinters-整个对象,对吗?不,列表中的每个晚餐都由表达式单独测试。“代码基本上围绕晚餐循环…”
void Foo(Func<Dinner, bool> f)
{
    bool result = f(new Dinner());
}