Linq выражение дозвуковой 3.0.0.3 - PullRequest
0 голосов
/ 14 сентября 2009

Я хочу «создать» комбинированный запрос для Subsonic 3.0.0.3, что лучше для этого?

Я пытался;

        Expression<Func<Person, bool>> exp = p => true;
        Expression<Func<Person, bool>> fContinent = p => p.ContinentID == 1;
        Expression<Func<Person, bool>> fType = p => p.TypeID == 1;
        exp = Expression.Lambda<Func<Person, bool>>(Expression.AndAlso(exp, fContinent), exp.Parameters);
        exp = Expression.Lambda<Func<Person, bool>>(Expression.AndAlso(exp, fType), exp.Parameters);
        var personList = Person.Find(exp);

Но это даст исключение «Бинарный оператор AndAlso не определен ...»

Я также пытался использовать предикаты, но они также генерируют исключения (Expression.Invoke не поддерживается).

В дозвуковой версии 2 я бы использовал объект SqlQuery, но мне хотелось бы узнать, как правильно сделать это в версии 3 с использованием выражений linq /.

Ответы [ 2 ]

0 голосов
/ 14 октября 2010

Я задал этот вопрос , но я использую комбинированный запрос в дозвуковых, как и вы.

Короче говоря, вы хотите использовать PredicateBuilder для построения запроса. Когда вы хотите выполнить его в своем дозвуковом объекте (при условии ActiveRecord), используйте код, подобный этому:

var predicate = /* Build up predicate with PredicateBuilder */;
var recs = SubsonicClass.All().Where(predicate.Compile()).ToList();
0 голосов
/ 14 сентября 2009

Вы пробовали And вместо AndAlso?

Правильный способ сделать это - объединить лямбда-выражение тел , например:

exp = Expression.Lambda<Func<Person, bool>>(
    Expression.And(exp.Body, fContinent.Body), exp.Parameters);

Даже если ваш поставщик запросов поддерживает And, вам также необходимо заменить ссылки на параметры в теле fContinent ссылками на параметр, определенный в exp - как, ваше выражение двух тела (в сочетании с And) ссылаются на два различных параметра, каждый из которых называется p.

См. Мой ответ на этот вопрос , чтобы узнать о самом чистом способе замены параметров выражения.

...