linq to sql的多条件动态查询(下)
生活随笔
收集整理的這篇文章主要介紹了
linq to sql的多条件动态查询(下)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
借助老外寫的一個擴展表達式的類,可以把上篇中的代碼寫得更優雅
這是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();
????????}
????}
?
轉載于:https://www.cnblogs.com/yjmyzz/archive/2008/03/25/1122135.html
總結
以上是生活随笔為你收集整理的linq to sql的多条件动态查询(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Replation requires t
- 下一篇: 设计模式1实践-开篇