我想'构建'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中执行此操作的正确方法。
答案 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();