Ваш первый запрос эквивалентен этому:
MyLinqToSQLTable.Where(x =>
{
return x.objectID == paramObjectID;
}).ToList();
Вам не хватает ключевого слова return
здесь. Это необходимо, когда лямбда-тело является явным блоком, а не выражением.
Спецификация формально определяет лямбда-выражение в грамматике, например:
лямбда-выражение
анонимная функция-подпись => анонимная функция-тело
анонимная функция тела
выражение
блок
Первый случай ( выражение ) применяется, когда тело не начинается с левой фигурной скобки. Последний случай ( block ) определяется как последовательность операторов (как тело метода). Как и в других местах в C #, операторы выражений в блоке ограничены объявлениями, присваиваниями, вызовом функций, увеличением и уменьшением. Простое применение оператора ==
к паре идентификаторов не делает выражение допустимым оператором. Вторая проблема заключается в том, что когда тип возвращаемого значения метода (анонимный или нет) не равен void
, все пути кода, достигающие конца блока, должны возвращать значение. Следовательно, даже если тело вашей лямбды было синтаксически допустимым, без оператора return, ваша лямбда была бы конвертируема в Action<T>
, а не в Func<T, bool>
, который ожидает метод Where
.
Обновление:
Проблема в том, что подразумеваемое возвращение, которое было там, когда я только что провел логическое сравнение, теперь не выполняется. Return (x.objectID == paramObjectID); тоже не принимаются.
Конечно, вариант x => { return x.objectID == paramObjectID; }
вашего лямбда-выражения возможен только , только когда он должен быть преобразован в анонимный метод , а не дерево выражений . То есть лямбда с телом block не конвертируется в Expression<T>
. Вот почему вы можете использовать его в LINQ to Objects (в котором Where
занимает Func<T, bool>
), но нельзя использовать его в LINQ to SQL (в котором Where
принимает Expression<Func<T, bool>>
).