Простой MVC NerdDinners Lambda - PullRequest
4 голосов
/ 12 мая 2009

В этом коде из учебника 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"? Как работает этот код? Я знаю, что это возвращает обеды, где dinnerid соответствует id из параметра функции. Я не понимаю, что означает "d идет ..." Я знаю, что это лямбда, но я не совсем понимаю. Для чего "д"? Что оно делает?

Может ли это быть написано без лямбды здесь (как)?

Ответы [ 4 ]

5 голосов
/ 12 мая 2009

Вам, вероятно, стоит прочитать анонимные методы .

В основном код, на который вы ссылаетесь, может быть написан как анонимный метод без синтаксиса ламбы, например:

public Dinner GetDinner(int id) {    
   return db.Dinners.SingleOrDefault(delegate (Dinner d) {
                                       return d.DinnerID == id;
                                     });
}
2 голосов
/ 12 мая 2009

Это тоже похоже ...

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

Код в основном циклически повторяет обеды, возвращая первый Обед или значение по умолчанию, если ничего не найдено.

Это тот случай, когда соглашения об именах, используемые в образце, не всегда подходят для производства. Использование «d» в качестве локальной переменной, как правило, происходит на месте, и выбор имени переменной «ужин», вероятно, будет более уместным, хотя в этом случае область действия d настолько мала, что это понятно в любом случае, если вы знаете, как работают лямбда-выражения.

2 голосов
/ 12 мая 2009

Вы должны понимать лямбда-синтаксис и для чего он используется.

Вот статья , которая неплохо объясняет это.

Однако, чтобы кратко ответить на ваш вопрос относительно контекста NerdDinner, «d» в этом контексте - это просто параметр, переданный в выражение lamda, которое является объектом Dinner.

0 голосов
/ 12 мая 2009

Этот бит кода:

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

...