Вы не можете передать делегат, потому что сигнатура метода задает дерево выражений, а не делегат - это так просто. Это два очень разных набора типов.
Что у них общего - и причина, по которой ваш последний фрагмент кода будет компилироваться, - это то, что компилятор может преобразовать лямбда-выражение в делегат или дерево выражений. Теперь это не то, как вы создаете делегат в первом случае - вы фактически используете преобразование группы методов. Это никогда не создаст дерево выражений.
Если вы хотите указать свой запрос в отдельном методе, он должен выглядеть примерно так:
private static Expression<Func<Northwind_LINQtoSQLDataContext,
IQueryable<Customer>>
GetPreCompiledQuery()
{
return db => from cust in db.Customers
where cust.Country == "Germany"
select cust;
}
Кстати, стоит помнить, что для простых запросов выражения запросов часто более громоздки, чем использование методов расширения. Например, приведенное выше эквивалентно:
private static Expression<Func<Northwind_LINQtoSQLDataContext,
IQueryable<Customer>>
GetPreCompiledQuery()
{
return db => db.Customers.Where(cust => cust.Country == "Germany");
}