借助老外写的一个扩展表达式的类,可以把上篇中的代码写得更优雅
这是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 实现多条件的动态查询(方法二)