0

我想为 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 / 表达式的正确方法。

4

2 回答 2

0

你试过And代替AndAlso吗?

这样做的正确方法是组合 lambda 表达式主体,如下所示:

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

即使And您的查询提供程序支持,您也需要将fContinent's Body中的参数引用替换为对exp--as 中定义的参数的引用,您的两个表达式主体(与 结合And)引用两个不同的参数,每个参数命名p.

有关替换表达式参数的最简洁方法,请参阅我对这个问题的回答。

于 2009-09-14T15:23:06.157 回答
0

我问了这个问题,但我和你一样在亚音速中使用组合查询。

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

var predicate = /* Build up predicate with PredicateBuilder */;
var recs = SubsonicClass.All().Where(predicate.Compile()).ToList();
于 2010-10-14T14:57:17.110 回答