新聞中心
LINQ模糊查詢來實(shí)現(xiàn)復(fù)合搜索的功能,具體的操作過程是什么呢?在這里向你介紹一下處理過程,使用LINQ模糊查詢有什么需要注意的呢?那么我們通過這個(gè)例子希望對你有所啟發(fā)。

創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站制作、做網(wǎng)站、中站網(wǎng)絡(luò)推廣、小程序開發(fā)、中站網(wǎng)絡(luò)營銷、中站企業(yè)策劃、中站品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供中站建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com
LINQ模糊查詢實(shí)現(xiàn)的多條件復(fù)合搜索效果如下圖:
LINQ模糊查詢實(shí)現(xiàn)階段一:
首先是找到了李永京(YJingLee)前輩的《LINQ體驗(yàn)(17)——LINQ to SQL語句之動態(tài)查詢》一文,利用Lambda表達(dá)式樹可以進(jìn)行動態(tài)查詢。寫了個(gè)方法進(jìn)行復(fù)合查詢,動態(tài)組合條件,生成Lambda表達(dá)式。
- ///
- /// 這個(gè)方法帶分頁功能,通過輸入的鍵值對NVC進(jìn)行復(fù)合查詢
- ///
- List
GetPagedObjectsByNVC( - int startIndex, int pageSize,
- NameValueCollection nvc, bool isAnd)
- {
- IQueryable
query = - Consulting.Instance.UserT_TractInfo;
- query.Where(t => t.IsDel == 0).
- Where(t => t.IsAuditing == 1);//審核和邏輯刪除
- Expression condition = null;
- ParameterExpression param = Expression.
- Parameter(typeof(UserT_TractInfo), "c");
- int propertyCount = 0;
- foreach (string key in nvc)
- {
- Expression right = Expression.Constant(nvc[key]);//鍵
- string keyProperty = key;//屬性
- if (typeof(UserT_TractInfo).GetProperty(keyProperty) != null)
- //當(dāng)對象存在此屬性時(shí)(因?yàn)殒I值對可能還有很多其他的參數(shù),例如page)
- {
- Expression left = Expression.Property(param,
- typeof(UserT_TractInfo).GetProperty(keyProperty));//建立屬性
- Expression filter = Expression.Equal(left, right);//過濾器
- if (condition == null)
- {
- condition = filter;
- }
- else
- {
- if (isAnd)
- {
- condition = Expression.And(condition, filter);
- }
- else
- {
- condition = Expression.Or(condition, filter);
- }
- }
- propertyCount++;
- }
- }
- //以上foreach組合了各個(gè)有效的鍵值對對應(yīng)的conditionExpression,
- //復(fù)合查詢最重要的組合工作就這么完了
- if (propertyCount > 0)
- {
- Expression pred = Expression.Lambda(condition, param);
- MethodCallExpression whereCallExpression =
- Expression.Call(typeof(Queryable), "Where",
- new Type[] { typeof(UserT_TractInfo) },
- Expression.Constant(query), pred);
- return Consulting.Instance.UserT_TractInfo.AsQueryable().
- Provider.CreateQuery
(whereCallExpression). - OrderByDescending(t => t.ID).Skip(startIndex - 1).
- Take(pageSize).ToList();//查詢出結(jié)果
- }
- else
- {
- return Consulting.Instance.UserT_TractInfo.
- OrderByDescending(t => t.ID).Skip(startIndex - 1).
- Take(pageSize).ToList();
- //如果沒有有效鍵值對,則返回全部結(jié)果
- }
- }
搞了半天本來很興奮的,之后才知道Lambda表達(dá)式是寫不出.Contains()的,我的心瓦涼瓦涼的。
LINQ模糊查詢實(shí)現(xiàn)階段二:
雖然李永京的文章沒給我多少幫助,但它后面有個(gè)回復(fù)很有價(jià)值:“用微軟提供的System.Linq.Dynamic方便點(diǎn)?!焙芸煺业搅藢?yīng)例子和Dynamic.cs,也找到了《Linq to SQL Dynamic 動態(tài)查詢》,有更細(xì)致的例子,可惜Dynamic.cs也是不能使用like的,恨??!
- return Consulting.Instance.UserT_TractInfo.Where(
- "b_number == @0","P(2007)031").OrderByDescending(t => t.ID).
- Skip(startIndex - 1).Take(pageSize).ToList();
代碼很容易,但沒什么用:(
LINQ模糊查詢實(shí)現(xiàn)階段三:
中文的實(shí)在是找不到了,在MS的官方BBS上找到了個(gè)鏈接,非常有用!《dynamic linq queries / dynamic where clause (part 2) 》,這個(gè)老外擴(kuò)展了Dynamic.cs,寫了個(gè)PredicateExtensions類,雖然不知道他是怎么想出來的,但確實(shí)有效!
這里放出核心代碼,很容易看懂,簡單就是美!
- searchPredicate = PredicateExtensions.
- True
(); - foreach (string key in nvcParam)
- {
- string condition = string.Empty;
- switch (key)
- {
- case "b_number":
- condition = nvcParam[key];
- searchPredicate = searchPredicate.And(u =>
- u.B_number.Contains(condition));
- break;
- case "b_address":
- condition = nvcParam[key];
- searchPredicate = searchPredicate.And(u =>
- u.B_address.Contains(condition));
- break;
- case "b_canton":
- condition = nvcParam[key];
- searchPredicate = searchPredicate.And(u =>
- u.B_canton.Contains(condition));
- break;
- case "a_status":
- condition = nvcParam[key];
- searchPredicate = searchPredicate.And(u =>
- u.A_status.ToString().Contains(condition));
- break;
- case "b_area":
- condition = nvcParam[key];
- searchPredicate = searchPredicate.And(u =>
- u.B_area.Contains(condition));
- break;
- case "c_clinchdate":
- condition = nvcParam[key];
- searchPredicate = searchPredicate.And(u =>
- u.C_clinchdate.Contains(condition));
- break;
- default:
- break;
- }
- }
- return Consulting.Instance.UserT_TractInfo.
- Where(searchPredicate).OrderByDescending(t => t.ID).
- Skip(startIndex - 1).Take(pageSize).ToList();
下面是我寫了注釋后的PredicateExtensions,我說不清楚構(gòu)造函數(shù)的True和False具體是怎么起作用的,但結(jié)果就是我的注釋那樣,在復(fù)合查詢寫條件時(shí)很重要(不過目前全寫AND就完成復(fù)合查詢了,我還沒搞多關(guān)鍵詞OR的那種):
- ///
- /// 構(gòu)造函數(shù)使用True時(shí):單個(gè)AND有效,多個(gè)AND有效;
- ///單個(gè)OR無效,多個(gè)OR無效;混合時(shí)寫在AND后的OR有效
- /// 構(gòu)造函數(shù)使用False時(shí):單個(gè)AND無效,多個(gè)AND無效;
- ///單個(gè)OR有效,多個(gè)OR有效;混合時(shí)寫在OR后面的AND有效
- ///
- public static class PredicateExtensions
- {
- public static Expression
- bool>> True
() { return f => true; } - public static Expression
> False () { - return f => false; }
- public static Expression
> - Or
(this Expression > expression1, - Expression
> expression2) - {
- var invokedExpression = Expression.Invoke(
- expression2, expression1.Parameters.Cast
()); - return Expression.Lambda
>( - Expression.Or(expression1.Body,
- invokedExpression),
- expression1.Parameters);
- }
- public static Expression
> And ( - this Expression
> expression1, - Expression
> expression2) - {
- var invokedExpression =
- Expression.Invoke(expression2,
- expression1.Parameters.Cast
()); - return Expression.Lambda
> - (Expression.And(expression1.Body, invokedExpression),
- expression1.Parameters);
- }
- }
原文來自:http://www.cnblogs.com/killuakun/archive/2008/08/03/1259389.html
LINQ模糊查詢實(shí)現(xiàn)復(fù)合搜索的基本內(nèi)容就向你介紹到這里,希望對你了解和掌握復(fù)合搜索的LINQ模糊查詢實(shí)現(xiàn)有所幫助。
新聞名稱:LINQ模糊查詢學(xué)習(xí)體驗(yàn)淺析
當(dāng)前網(wǎng)址:http://m.fisionsoft.com.cn/article/dpogegd.html


咨詢
建站咨詢
