возвратитесь из linq где оператор

У меня есть функция следующей ссылки

MyLinqToSQLTable.Where(x => x.objectID == paramObjectID).ToList();

Я большую часть времени можно изменить вызов linq, чтобы быть несколькими строками путем добавления фигурных скобок вокруг тела метода. Как это:

MyLinqToSQLTable.Where(x =>
{ 
    x.objectID == paramObjectID;
}).ToList();

Проблемой является подразумеваемый возврат, который был там, когда я просто сделал булевскую переменную, выдерживают сравнение, теперь не сделан. Возвратитесь (x.objectID == paramObjectID); не принят также.

Как действительно делают это? я могу сделать это?

Примечание: Я знаю, что могу добавить другого где пункт в случае необходимости. Но я все еще хотел бы знать ответ на это.

6
задан Vaccano 11 March 2010 в 20:55
поделиться

2 ответа

Ваш первый запрос эквивалентен этому:

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 > ).

8
ответ дан 16 December 2019 в 21:38
поделиться

Это работает?

MyLinqToSQLTable.Where(x =>  
{   
    return x.objectID == paramObjectID;  
}).ToList();  
1
ответ дан 16 December 2019 в 21:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: