Model view controller 简单MVC NerdDinners Lambda
在这段来自微软MVC教程NerdDinners的代码中: 公共级餐厅{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
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());
}