linq to sql的多条件动态查询

更新时间:2024-01-01 15:10:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

linq to sql的多条件动态查询确实是一件头痛的事情,用表达式树或反射方法要写一大堆代码,有时候想想与其这么复杂,还不如回到手动sql拼接的年代,但是技术总是向前发展的,终归还是要在linq上解决这一问题,无意在网上发现一个还算比较简单的办法,分享一下: void ShowData() {

using (DBDataContext db = new DBDataContext(Database.ConnectionString)) {

Expression> expr = n => GetCondition(n);

var _query = db.T_Bargins.Where(expr.Compile()).Select(b => new { b.F_Money, b.F_Name });

foreach (var item in _query) {

Response.Write(item.F_Name + \ + item.F_Money.ToString() + \); } } }

//得到合同金额大于6000,或合同名称中包含\江华\字的条件 private bool GetCondition(T_Bargin _Table) {

bool _result = false;

decimal _MinMoney = 6000;

if (_MinMoney > 0) {

_result |= _Table.F_Money >= _MinMoney;

}

string _Name = \江华\;

if (!String.IsNullOrEmpty(_Name)) {

_result |= _Table.F_Name.Contains(_Name); }

return _result; }

借助老外写的一个扩展表达式的类,可以把上篇中的代码写得更优雅 这是PredicateBuilder的源文件

public static class PredicateBuilder {

public static Expression> True () public static Expression> False ()

public static Expression> Or (this Expression> expr1, Expression> expr2) {

var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast ());

{ return f => true; } { return f => false; }

return Expression.Lambda>

(Expression.Or (expr1.Body, invokedExpr), expr1.Parameters); }

public static Expression> And (this Expression> expr1, Expression> expr2) {

var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast ()); return Expression.Lambda>

(Expression.And (expr1.Body, invokedExpr), expr1.Parameters); } }

下面是使用示例 :

List GetProductsByAND(params string[] keywords) {

DBDataContext db = new DBDataContext(Database.ConnectionString); IQueryable query = db.Products; foreach (string keyword in keywords) {

string temp = keyword;

query = query.Where(p => p.Description.Contains(keyword)); }

//翻译后的sql语句:

//SELECT [t0].[ID], [t0].[Name], [t0].[Description] //FROM [dbo].[Product] AS [t0]

//WHERE ([t0].[Description] LIKE '%手机%') AND ([t0].[Description] LIKE 'a11%')

return query.ToList(); }

List GetProductsByOR(params string[] keywords) {

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 'a11%') OR ([t0].[Description] LIKE '#50%') return query.ToList(); }

void ShowData() {

//var _products = GetProductsByOR(\ //Repeater1.DataSource = _products; //Repeater1.DataBind();

var predicate = PredicateBuilder.True();

string _name = \;

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.bwwdw.com/article/ughx.html

Top