Простой MVC NerdDinners Lambda
В этом коде из учебника 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); }
"д" означает? Как работает этот код? Я знаю, что это возвращает обеды, где dinnerid соответствует id из параметра функции. Я не понимаю, что означает "d идет..." Я знаю, что это лямбда, но я не совсем понимаю. Для чего "д"? Что оно делает?
Могло ли это быть написано без лямбды здесь (как)?
4 ответа
Вы, вероятно, должны прочитать анонимные методы.
В основном код, на который вы ссылаетесь, может быть написан как анонимный метод без синтаксиса lamba, например:
public Dinner GetDinner(int id) {
return db.Dinners.SingleOrDefault(delegate (Dinner d) {
return d.DinnerID == id;
});
}
Это тоже похоже...
from d in db.Dinners
where d.DinnerID == id
select d
Код в основном циклически повторяет обеды, возвращая первый Обед или значение по умолчанию, если ничего не найдено.
Это тот случай, когда соглашения об именах, используемые в образце, не всегда подходят для производства. Использование "d" в качестве локальной переменной, как правило, происходит на месте, и выбор имени переменной "ужин", вероятно, будет более уместным, хотя в этом случае область действия d настолько мала, что понятно в любом случае, если вы знаете, как работают лямбда-выражения.
Вы должны понимать лямбда-синтаксис и то, для чего он используется.
Вот статья, которая делает достойную работу объяснения этого.
Однако, чтобы кратко ответить на ваш вопрос относительно контекста NerdDinner, "d" в этом контексте - это просто параметр, переданный в выражение lamda, которое является объектом Dinner.
Этот бит кода:
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, и все выполнение выполняется внутри базы данных.