Передача делегата в метод CompiledQuery.Compile - PullRequest
0 голосов
/ 26 февраля 2011

При попытке передать делегат System.Func<T,TResult> методу CompiledQuery.Compile я получаю следующую ошибку

" Ошибка 1 Аргументы типа для метода 'System.Data.Linq.CompiledQuery.Compile(System.Linq.Expressions.Expression>) 'не может быть выведен из использования. Попробуйте указать аргументы типа явно . "

public static void CompiledLINQQuery()
{
    Northwind_LINQtoSQLDataContext objData = new Northwind_LINQtoSQLDataContext();
    Func<Northwind_LINQtoSQLDataContext, IQueryable<Customer>> LINQHolder = GetPreCompiledQuery;

    LINQHolder = CompiledQuery.Compile(LINQHolder); //This is where the error comes up           
    var Results = LINQHolder.Invoke(objData);   
}

private static IQueryable<Customer> GetPreCompiledQuery(Northwind_LINQtoSQLDataContext objD)
{
    return from cust in objD.Customers where cust.Country == "Germany" select cust;
}

в то же время, если я передам LINQ напрямуюметод CompiledQuery.Compile, то работает без ошибок.

LINQHolder = CompiledQuery.Compile((Northwind_LINQtoSQLDataContext objD) => from cust in objD.Customers where cust.Country == "Germany" select cust);

Я не понимаю, почему я не могу передать делегат вместо выражения запроса LINQ.

Пожалуйста, помогите мне решить эту проблему.

Ответы [ 2 ]

1 голос
/ 26 февраля 2011

Вы не можете передать делегат, потому что сигнатура метода задает дерево выражений, а не делегат - это так просто. Это два очень разных набора типов.

Что у них общего - и причина, по которой ваш последний фрагмент кода будет компилироваться, - это то, что компилятор может преобразовать лямбда-выражение в делегат или дерево выражений. Теперь это не то, как вы создаете делегат в первом случае - вы фактически используете преобразование группы методов. Это никогда не создаст дерево выражений.

Если вы хотите указать свой запрос в отдельном методе, он должен выглядеть примерно так:

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");
}
1 голос
/ 26 февраля 2011

CompiledQuery.Compile () определяется только в выражении>, но не в Func <>

Ваш код компилируется, если вы переписываете оператор как

var LINQHolder = GetPreCompiledQuery;
var CompiledLINQHolder = CompiledQuery.Compile(LINQHolder); 

?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...