возврат из linq, где заявление - PullRequest
6 голосов
/ 11 марта 2010

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

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

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

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

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

Как это сделать? я могу это сделать?

ПРИМЕЧАНИЕ. Я знаю, что при необходимости могу добавить еще один оператор where. Но я все еще хотел бы знать ответ на этот вопрос.

Ответы [ 3 ]

8 голосов
/ 11 марта 2010

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

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

1 голос
/ 12 марта 2010

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

MyLinqToSQLTable.Where(x =>  
{   
    return x.objectID == paramObjectID;  
}).ToList();  
0 голосов
/ 08 марта 2014
MyLinqToSQLTable.Where(x =>  
{   
    return x.objectID == paramObjectID;  
}).ToList();  
or
MyLinqToSQLTable.Where(x =>  
{   
    return x.objectID == paramObjectID;  
}).ToArray();
...