public static class PredicateBuilder
    {
        public static Expression<Func<T, bool>> True<T>() { return f => true; }
        public static Expression<Func<T, bool>> False<T>() { return f => false; }        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
                                                            Expression<Func<T, bool>> expr2)
        {
            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>
                  (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
        }        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
                                                             Expression<Func<T, bool>> expr2)
        {
            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>
                  (Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
        }
    }
//上面是一个构造表达式树的类
public static IQueryable<HR_Company_Position> GetHR_Company_PositionByKeyWords(string keyword)
        {
            try
            {
                if (!string.IsNullOrEmpty(keyword))
                {
                    //Expression<Func<Product, bool>> expr = n => GetCondintion(n);                    var list = dal.GetHR_Company_Position();
                    var keyarry = keyword.Split(' ', '/');                    var predicate = PredicateBuilder.False<HR_Company_Position>();                    foreach (var s in keyarry)
                    {
                        var temp = s.Trim();
                        predicate = predicate.Or(p => p.Position.Contains(temp));
                    }                    return list.Where(predicate).Select(p => p).Distinct();
                }
                else
                {
                    return dal.GetHR_Company_Position();
                }
            }
            catch
            {
                return null;
            }
        }
//这里是调用的方法但是我将构造表达树的类放到 一个common 类库里 却出现问题
  predicate = predicate.Or(p => p.Position.Contains(temp));
这个Or方法不会出现。但是放在同一个cs文件却没问题。。
请教大家

解决方案 »

  1.   

    但是我将构造表达树的类放到 一个common 类库里 却出现问题   predicate = predicate.Or(p => p.Position.Contains(temp)); 这个Or方法不会出现。但是放在同一个cs文件却没问题。。
    public static class PredicateBuilder
        {
            public static Expression<Func<T, bool>> True<T>() { return f => true; }
            public static Expression<Func<T, bool>> False<T>() { return f => false; }        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
                                                                Expression<Func<T, bool>> expr2)
            {
                var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
                return Expression.Lambda<Func<T, bool>>
                      (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
            }        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
                                                                 Expression<Func<T, bool>> expr2)
            {
                var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
                return Expression.Lambda<Func<T, bool>>
                      (Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
            }
        }这是一个静态的扩展类。如果我将他放到common(自己写的库)里,然后编译成dll。之后在另外一个库(bll库吧)引用。
    然后在一个bll类里调用
    public static IQueryable<HR_Company_Position> GetHR_Company_PositionByKeyWords(string keyword)
            {
                try
                {
                    if (!string.IsNullOrEmpty(keyword))
                    {
                        //Expression<Func<Product, bool>> expr = n => GetCondintion(n);                    var list = dal.GetHR_Company_Position();
                        var keyarry = keyword.Split(' ', '/');                    var predicate = PredicateBuilder.False<HR_Company_Position>();                    foreach (var s in keyarry)
                        {
                            var temp = s.Trim();
                            predicate = predicate.Or(p => p.Position.Contains(temp));
                        }                    return list.Where(predicate).Select(p => p).Distinct();
                    }
                    else
                    {
                        return dal.GetHR_Company_Position();
                    }
                }
                catch
                {
                    return null;
                }
            }
    //这里是调用的方法这种操作 会出问题。而我将 静态的扩展类 放在 bll库里。却没问题
      

  2.   

    要用using引入PredicateBuilder类所在的命名空间,这个PredicateBuilder我也在一个比较早的项目中用过,很好用,是那个LinqPad的作者写的。======================================================================
    ASP.NET WebForm和ASP.NET MVC分页最终解决之道
      

  3.   

    Expression<Func<ProductExt, bool>> predicate = null;
       predicate = predicate.AndAlso(p => p.CompanyName.Length > 2)
           .OrElse((Products p) => p.ProductName.Contains("c"))
         .AndAlso((Products p) => p.UnitPrice >= 22);
      

  4.   

    命名空间肯定用的。。 var predicate =FFD.Common.PredicateBuilder.False<HR_Company_Position>();                    foreach (var s in keyarry)
                        {
                            var temp = s.Trim();
                            predicate = predicate.Or(p => p.Position.Contains(temp));
                        }就是  predicate = predicate.Or(p => p.Position.Contains(temp));
    说没有Or这个方法
    这时是放在另外一个库的。。
    5楼的大哥想告诉我怎样用这个类吗?
      

  5.   


    正解,你为引用Common命名空间,当然完整的命名空间只有你自己知道。
      

  6.   


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Linq.Expressions;namespace FPD.Common
    {
        public static class PredicateBuilderClass
        {
            public static Expression<Func<T, bool>> True<T>() { return f => true; }
            public static Expression<Func<T, bool>> False<T>() { return f => false; }        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
                                                                Expression<Func<T, bool>> expr2)
            {
                var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
                return Expression.Lambda<Func<T, bool>>
                      (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
            }        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
                                                                 Expression<Func<T, bool>> expr2)
            {
                var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
                return Expression.Lambda<Func<T, bool>>
                      (Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
            }
        }}
    写到另外的库的 生成类
    但是不知道为什么现在又可以啦。。之前生成n多次都是不行的。。
    谢谢啊