首页 > IT职业 > IT职场 > linq to sql的多条件动态查询
借助老外写的一个扩展表达式的类,可以把上篇中的代码写得更优雅
这是PredicateBuilder的源文件
public static class PredicateBuilder
...{
public static Expression
public static Expression
public static Expression
Expression
...{
var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast
return Expression.Lambda
(Expression.Or (expr1.Body, invokedExpr), expr1.Parameters);
}
public static Expression
Expression
...{
var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast
return Expression.Lambda
(Expression.And (expr1.Body, invokedExpr), expr1.Parameters);
}
}
下面是使用示例 :
List
...{
DBDataContext db = new DBDataContext(Database.ConnectionString);
IQueryable
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
...{
DBDataContext db = new DBDataContext(Database.ConnectionString);
var predicate = PredicateBuilder.False
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
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();
}
}
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/166/viewspace-2801236/ ,如需转载,请注明出处,否则将追究法律责任。