您的位置:首页 > 其它

Linq 多条件查询组合问题

2014-05-27 13:57 375 查看
借助老外写的一个扩展表达式的类,可以把上篇中的代码写得更优雅

这是PredicateBuilder的源文件

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.Or (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.And (expr1.Body, invokedExpr), expr1.Parameters);
      }
    }


下面是使用示例 :

List<Product> GetProductsByAND(params string[] keywords) 
    {
        DBDataContext db = new DBDataContext(Database.ConnectionString);
        IQueryable<Product> query = db.Products;
        foreach (string keyword in keywords)
        {
            string temp = keyword;
            query = query.Where(p => p.Description.Contains(temp));
        }
        //翻译后的sql语句:
        //Select [t0].[ID], [t0].[Name], [t0].[Description]
        //FROM [dbo].[Product] AS [t0]
        //Where ([t0].[Description] LIKE '%手机%') AND ([t0].[Description] LIKE '%6111%')
        return query.ToList();   
    }

    List<Product> GetProductsByOR(params string[] keywords)
    {
        DBDataContext db = new DBDataContext(Database.ConnectionString);
        var predicate = PredicateBuilder.False<Product>();
        foreach (string keyword in keywords)
        {
            string temp = keyword;
            predicate = predicate.Or(p => p.Description.Contains(temp));
        }
        var query = db.Products.Where(predicate);
        //翻译后的sql语句:
        //Select [t0].[ID], [t0].[Name], [t0].[Description]
        //FROM [dbo].[Product] AS [t0]
        //Where ([t0].[Description] LIKE '%6111%') OR ([t0].[Description] LIKE '%2350%')
        return query.ToList();
    }

    void ShowData() 
    {
        //var _products = GetProductsByOR("6111", "2350");
        //Repeater1.DataSource = _products;
        //Repeater1.DataBind();

        var predicate = PredicateBuilder.True<Product>();

        string _name = "6111";
        if (!string.IsNullOrEmpty(_name)) 
        {
            predicate = predicate.And(p => p.Name.Contains(_name));
        }

        string _description = "长虹";
        if (!string.IsNullOrEmpty(_description)) 
        {
            predicate = predicate.And(p => p.Description.Contains(_description));
        }

        using (DBDataContext db = new DBDataContext(Database.ConnectionString))
        {
            var _Products = db.Products.Where(predicate);
            Repeater1.DataSource = _Products;
            Repeater1.DataBind();
        }

    }


我的代码:

var bproductwhere = PredicateBuilder.True<bstate_view>();
					//工厂名称
					if (!string.IsNullOrEmpty(strParm[0]))
					{
						bproductwhere = bproductwhere.And(p => p.工厂名称 == strParm[0]);
					}
					//出库日期
					if (!string.IsNullOrEmpty(strParm[1]))
					{
						if (string.IsNullOrEmpty(strParm[0]))
						{
							bproductwhere = bproductwhere.And(p => p.工厂名称 == context.Server.UrlDecode
											(context.Request.Cookies["UserLogin"]["ClientName"]));
						}
						string[] strDate = strParm[1].Split('-');
						bproductwhere = bproductwhere.And(p => Convert.ToDateTime(p.出库日期) >= Convert.ToDateTime(strDate[0])
									&& Convert.ToDateTime(p.出库日期) < Convert.ToDateTime(strDate[1]).AddDays(1));
					}
					//品番
					if (!string.IsNullOrEmpty(strParm[2]))
					{
						bproductwhere = bproductwhere.And(p => p.品番 == strParm[2]);
					}


原文地址:http://www.cnblogs.com/yjmyzz/archive/2008/03/25/1122135.html 感谢
http://developer.51cto.com/art/200909/151931.htm 简单解决Linq多条件组合问题
http://blog.csdn.net/zhensoft163/article/details/7408788 Linq to sql 实现多条件的动态查询(方法一)
http://blog.csdn.net/zhensoft163/article/details/7455875 Linq to sql 实现多条件的动态查询(方法二)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: