Linq表达亚音速3.0.0.3

时间:2009-09-14 15:14:11

标签: linq subsonic subsonic3 expression

我想'构建'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对象,但我想知道使用linq / expressions在版本3中执行此操作的正确方法。

2 个答案:

答案 0 :(得分:0)

您是否尝试过And代替AndAlso

正确的方法是组合lambda表达式 body ,如下所示:

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

即使查询提供程序支持And,您还需要使用fContinent中定义的参数替换exp的Body中的参数引用 - 因此,您的两个表达式主体(与And结合)引用了两个不同的参数,每个参数都名为p

请参阅我对this question的回答,了解替换表达式参数的最简洁方法。

答案 1 :(得分:0)

我问过this question,但我正在像你一样使用亚音速的合并查询。

简而言之,您希望使用PredicateBuilder来构建查询。如果要在亚音速对象中执行它(假设为ActiveRecord),请使用以下代码:

var predicate = /* Build up predicate with PredicateBuilder */;
var recs = SubsonicClass.All().Where(predicate.Compile()).ToList();