Параметр лямбды

437
05 февраля 2017, 10:43

В одной из книг по EntityFramework есть описание кода:

  1. We created an object of the DbContext class:

    ToDoDBEntities db = new ToDoDBEntities()
    
  2. Retrieved an item by passing the key values, that is, using the Find function:

    ToDo todo1 = db.ToDos.Find(id);
    
  3. Retrieved an item by passing a non-key value using the FirstOrDefault function:

    ToDo todo2 = db.ToDos.SingleOrDefault(item => item.TodoItem == "Test item");
    
  4. Retrieved an item by passing a non-key value using the SingleOrDefault function:

    ToDo todo2 = db.ToDos.SingleOrDefault(item => item.TodoItem == "Test item");
    

Вопрос, откуда берется параметр item в лямбда? item => item.TodoItem == "Test item"); Ведь мы его нигде не объявляли.

Answer 1

Дело в том, что при переборе списка будет вызываться Ваша лямбда-функция, которой будет передаваться параметр item (название может быть любым) - это элемент списка в текущей итерации. А потом в теле лямбда-функции можно, используя этот параметр, обратиться к элементу в текущей итерации перебора списка и выполнить какое-либо действие.

Конкретно в этом случае, мы в SingleOrDefault передаём функцию, которая проверяет равен ли элемент заданному условию item.TodoItem == "Test item" и данная лямбда функция возвращает результат этого условия как свой результат.

Это выражение можно представить себе следующим образом, но так делать неправильно, так как у Вас выгрузятся все записи на клиент, вариант с лямбда внутри работает по другому!

Ваша лямбда функция это как метод:

public bool Compare(ToDo item)
{
    return item.TodoItem == "Test item";
}

А Ваш вызов SingleOrDefault, вызов метода в который мы передаём другой метод, для сравнения объектов:

ToDo result = db.ToDos.SingleOrDefault(Compare);
Answer 2

Вы его объявляли. Посмотрите внимательнее на вот эту запись:

item => item.TodoItem == "Test item"

В левой части лямбда-выражения объявляется параметр item. В данном случае его тип определяется компилятором автоматически, но можно его задать и вручную:

(ToDo item) => ...

Имя для параметра можно выбирать произвольно (точнее, есть одно ограничение: имя параметра не может совпадать с именем локальной переменной).

В правой части лямбда-выражения используется параметр, объявленный в левой части.

READ ALSO
Js в проекте c# [требует правки]

Js в проекте c# [требует правки]

Как взаимодействовать с скриптом на сайте через программу (вызывать определенные функции, click)Подскажите как это реализовать

430
Запись массива в сессию

Запись массива в сессию

Как записать в сессию массив, следующего плана

562
Две версии PHP на одном сервере

Две версии PHP на одном сервере

Можно ли на одном сервере установить две версии PHP (43

519