新聞中心
LINQ動(dòng)態(tài)查詢(xún)的過(guò)程是怎么實(shí)現(xiàn)的呢?我們實(shí)現(xiàn)LINQ動(dòng)態(tài)查詢(xún)會(huì)用到還說(shuō)呢么方法呢?擴(kuò)展庫(kù)Dynamic.cs的實(shí)現(xiàn)是什么效果呢?那么讓我們來(lái)看看具體的內(nèi)容。

創(chuàng)新互聯(lián)公司客戶(hù)idc服務(wù)中心,提供德陽(yáng)服務(wù)器托管、成都服務(wù)器、成都主機(jī)托管、成都雙線服務(wù)器等業(yè)務(wù)的一站式服務(wù)。通過(guò)各地的服務(wù)中心,我們向成都用戶(hù)提供優(yōu)質(zhì)廉價(jià)的產(chǎn)品以及開(kāi)放、透明、穩(wěn)定、高性?xún)r(jià)比的服務(wù),資深網(wǎng)絡(luò)工程師在機(jī)房提供7*24小時(shí)標(biāo)準(zhǔn)級(jí)技術(shù)保障。
LINQ動(dòng)態(tài)查詢(xún)已經(jīng)由微軟提供的一個(gè)LINQ動(dòng)態(tài)查詢(xún)擴(kuò)展庫(kù)Dynamic.cs實(shí)現(xiàn)(下載地址:http://msdn.microsoft.com/en-us/vcsharp/bb894665.aspx,該文件包含在\CSharpSamples\LinqSamples\DynamicQuery目錄下),這個(gè)擴(kuò)展庫(kù)支持在Where方法中使用SQL查詢(xún)表達(dá)式,這樣我們可以在表示層或業(yè)務(wù)層構(gòu)建SQL條件表達(dá)式,然后交給LINQ查詢(xún),遺憾的是,這個(gè)擴(kuò)展庫(kù)不支持SQL中的“Like”運(yùn)算符,沒(méi)有模糊查詢(xún)功能的查詢(xún)?cè)趺茨芙胁樵?xún)呢(拗口……)
事實(shí)上,動(dòng)態(tài)查詢(xún)庫(kù)是利用Lambda表達(dá)式來(lái)實(shí)現(xiàn)動(dòng)態(tài)查詢(xún)功能的,因此只要對(duì)該擴(kuò)展庫(kù)再次進(jìn)行擴(kuò)展,讓它支持LIKE操作符就是,實(shí)現(xiàn)起來(lái)并不困難。擴(kuò)展庫(kù)的原理是重載擴(kuò)展方法Where,然后對(duì)傳入的字符串形式的SQL條件表達(dá)式進(jìn)行分析,最終生成Lambda式。明白這個(gè)原理后,修改起來(lái)也就很簡(jiǎn)單了。
找到ExpressionParser類(lèi),在TokenId枚舉中增加一個(gè)枚舉值:Like,在分析字符串表達(dá)式的方法中加入一個(gè)case條件,用來(lái)判斷操作符是否為L(zhǎng)ike:
LINQ動(dòng)態(tài)查詢(xún)實(shí)現(xiàn)實(shí)例:
- case 'L':
- case 'l':
- NextChar();
- if (ch == 'I' || ch == 'i')
- {
- NextChar();
- if (ch == 'K' || ch == 'k')
- {
- NextChar();
- if (ch == 'E' || ch == 'e')
- {
- NextChar();
- t = TokenId.Like;
- }
- }
- }
- break;
需要修改的還有幾個(gè)方法,不再一一細(xì)述,目的都是為了對(duì)Like操作符進(jìn)行檢查,并轉(zhuǎn)到查應(yīng)的操作。***增加一個(gè)方法GenerateLike,用來(lái)產(chǎn)生支持模糊查詢(xún)的Lambda表達(dá)式。代碼如下:
- //創(chuàng)建Like表達(dá)式
- Expression GenerateLike(Expression left, Expression right)
- {
- string value = right.ToString().Replace("\"","");
- right = RemovePrecent(value);
- if (value.StartsWith("%") && value.EndsWith("%"))
- {
- MethodInfo method = left.Type.GetMethod("Contains");
- return Expression.Call(left, method, new[] { right });
- }
- else if(value.StartsWith("%"))
- {
- MethodInfo method = left.Type.GetMethod(
- "EndsWith", new[] { typeof(string) });
- return Expression.Call(left, method, new[] { right });
- }
- else if (value.EndsWith("%"))
- {
- MethodInfo method = left.Type.GetMethod(
- "StartsWith", new[] { typeof(string) });
- return Expression.Call(left, method, new[] { right });
- }
- return GenerateEqual(left, right);
- }
- //去掉查詢(xún)字符中的%符號(hào)
- Expression RemovePrecent(string value)
- {
- return Expression.Constant(
- value.Replace("%",String.Empty),
- typeof(string));
- }
LINQ動(dòng)態(tài)查詢(xún)的相關(guān)內(nèi)容就向你介紹到這里,希望那個(gè)對(duì)你了解和學(xué)習(xí)LINQ動(dòng)態(tài)查詢(xún)有所幫助。
【編輯推薦】
- LINQ模糊查詢(xún)的學(xué)習(xí)心得淺析
- LINQ嵌套查詢(xún)實(shí)現(xiàn)淺析
- LINQ查詢(xún)方式的探尋
- LINQ查詢(xún)的效果分析
- LINQ查詢(xún)和泛型類(lèi)型的關(guān)系淺析
標(biāo)題名稱(chēng):LINQ動(dòng)態(tài)查詢(xún)的實(shí)現(xiàn)淺析
當(dāng)前URL:http://m.fisionsoft.com.cn/article/cdgjjgc.html


咨詢(xún)
建站咨詢(xún)
