Как Expression.Invoke произвольный LINQ to SQL Query - PullRequest
0 голосов
/ 14 апреля 2010

Скажем, я беру произвольное LINQ to SQL выражение выражения , возможно ли его как-нибудь вызвать?

MyContext ctx1 = new MyContext("...");
var q = from t in ctx1.table1 where t.id = 1 select t;
Expression qe = q.Expression;
var res = Expression.Invoke(qe); 

Это броски:

ArgumentException "Невозможно вызвать выражение типа System.Linq.IQueryable`1 [...] '".

Моя конечная цель - оценить один и тот же запрос в нескольких разных контекстах данных.

Ответы [ 3 ]

1 голос
/ 14 апреля 2010

Запросы не являются выражениями. Запрос имеет ExpressionTree.

Запросы не являются вызываемыми методами.

Запросы могут быть Перечислены, давая свои результаты. Этот код будет перечислять любой IQueryable:

List<object> result = query.Cast<object>().ToList();

Моя конечная цель - оценить один и тот же запрос на нескольких разных данных контексты.

Затем вы должны написать свои запросы как генераторы запросов, которые принимают DataContext в качестве параметра.

Func<MyDataContext, IQueryable<Customer>> queryGen =
    (dc) => dc.Customers.Where(c => c.Name == "Bob");
  //now we can get some queries
IQueryable<Customer> query1 = queryGen(new MyDataContext());
IQueryable<Customer> query2 = queryGen(new MyDataContext());
0 голосов
/ 14 апреля 2010

Если ваша цель - запустить выражение в разных контекстах, почему бы не создать только такое выражение: -

    Expression<Func<MyClass, bool>> myExpression = x => x.id == 1;

Тогда вы можете делать с ним все, что захотите, в том числе использовать его в предложениях .Where ().

0 голосов
/ 14 апреля 2010

LINQ to SQL выражения анализируются поставщиком LINQ to SQL и преобразуются в T-SQL . Я предполагаю, что исключение возникает явно - Microsoft не намеревалась вызывать эти выражения напрямую (это можно подтвердить с помощью .NET Reflector .)

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