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