Your first query is equivalent to this one:
MyLinqToSQLTable.Where(x =>
{
return x.objectID == paramObjectID;
}).ToList();
You are missing the return
keyword here. It's necessary when the lambda body is an explicit block rather than an expression.
The spec formally defines lambda-expression in grammar like:
lambda-expression:
anonymous-function-signature => anonymous-function-body
anonymous-function-body:
expression
block
The former case (expression) applies when the body doesn't begin with a left curly brace. The latter case (block) is defined as a series of statements (just like a method body). Like other places in C#, expression statements in a block are restricted to declarations, assignments, function call, increment, and decrement. Merely applying operator ==
to a couple identifiers doesn't the expression a valid statement. The second issue is that when the return type of a method (anonymous or not) is not void
, all code paths reaching the end of the block should return a value. Consequently, even if the body of your lambda was syntactically valid, without a return statement, your lambda would be convertible to Action<T>
, and not Func<T, bool>
that Where
method expects.
Update:
Problem is the implied return that was there when I just did a Boolean compare is now not done. Return (x.objectID == paramObjectID); is not accepted either.
Of course, the x => { return x.objectID == paramObjectID; }
variant of your lambda expression is only possible when it's supposed to be converted to an anonymous method, not an expression tree. That is, a lambda with a block body is not convertible to Expression<T>
. That's why you can use it in LINQ to Objects (in which Where
takes Func<T, bool>
) but you can't use it in LINQ to SQL (in which Where
takes Expression<Func<T, bool>>
).