Простой 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, и все выполнение выполняется внутри базы данных.

Другие вопросы по тегам