【问题标题】:Linq expression subsonic 3.0.0.3Linq 表达式亚音速 3.0.0.3
【发布时间】:2009-09-14 15:14:10
【问题描述】:

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

【问题讨论】:

    标签: linq subsonic subsonic3 expression


    【解决方案1】:

    您是否尝试过And 而不是AndAlso

    正确的做法是结合 lambda 表达式body,像这样:

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

    即使您的查询提供程序支持And,您也需要将fContinent 的正文中的参数引用替换为对exp 中定义的参数的引用——照原样,您的两个表达式主体(结合And)引用了两个不同的参数,每个参数都命名为p

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

    【讨论】:

    • 我现在通过阅读您在其他帖子中放置的链接了解它; blogs.msdn.com/meek/archive/2008/05/02/…我的另一个问题;这是构建查询的推荐方式还是我应该使用 SqlQuery 类?
    • 我从来没有用过 Subsonic,所以我不能说哪个更好。
    【解决方案2】:

    我问过this question,但我和你一样在亚音速中使用组合查询。

    简而言之,您想使用PredicateBuilder 来构建查询。当你想在你的 subsonic 对象中执行它时(假设 ActiveRecord),使用这样的代码:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多