asp.net 根據(jù)漢字的拼音首字母搜索數(shù)據(jù)庫(附 LINQ 調(diào)用方法)
更新時(shí)間:2010年04月25日 21:43:59 作者:
我們經(jīng)常需要使用拼音首字母來檢索數(shù)據(jù)庫,特別是應(yīng)用于醫(yī)院、商店等行業(yè)軟件中。譬如搜索“zgr”就可以搜索所有包含“中國(guó)人”的記錄。那么如果來實(shí)現(xiàn)才能即高效又方便呢?
方法一:先查詢出所有記錄,然后在邏輯層轉(zhuǎn)化為拼音首字母后查詢,顯然傻瓜才會(huì)這么做。
方法二:在需要搜索的表中添加一個(gè)字段用于存放被檢索字段內(nèi)容對(duì)應(yīng)的拼音,在搜索的時(shí)候同時(shí)去查詢這兩個(gè)字段,這種方法可行,但會(huì)增加數(shù)據(jù)庫存放的大小。
方法三:在數(shù)據(jù)庫中建立一個(gè)函數(shù),在執(zhí)行查詢語句時(shí)通過此函數(shù)來轉(zhuǎn)化搜索,函數(shù)如下:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: xoyozo
-- Create date: 2010-4-17
-- Description: 提供中文首字母
-- =============================================
CREATE FUNCTION fun_getPY
(
@str NVARCHAR(4000)
)
RETURNS NVARCHAR(4000)
AS
BEGIN
DECLARE @word NCHAR(1),@PY NVARCHAR(4000)
SET @PY=''
WHILE len(@str)>0
BEGIN
SET @word=left(@str,1)
SET @PY=@PY+(CASE WHEN unicode(@word) BETWEEN 19968 AND 19968+20901
THEN (SELECT TOP 1 PY FROM (
SELECT 'A' AS PY,N'驁' AS word
UNION ALL SELECT 'B',N'簿'
UNION ALL SELECT 'C',N'錯(cuò)'
UNION ALL SELECT 'D',N'鵽'
UNION ALL SELECT 'E',N'樲'
UNION ALL SELECT 'F',N'鰒'
UNION ALL SELECT 'G',N'腂'
UNION ALL SELECT 'H',N'夻'
UNION ALL SELECT 'J',N'攈'
UNION ALL SELECT 'K',N'穒'
UNION ALL SELECT 'L',N'鱳'
UNION ALL SELECT 'M',N'旀'
UNION ALL SELECT 'N',N'桛'
UNION ALL SELECT 'O',N'漚'
UNION ALL SELECT 'P',N'曝'
UNION ALL SELECT 'Q',N'囕'
UNION ALL SELECT 'R',N'鶸'
UNION ALL SELECT 'S',N'蜶'
UNION ALL SELECT 'T',N'籜'
UNION ALL SELECT 'W',N'鶩'
UNION ALL SELECT 'X',N'鑂'
UNION ALL SELECT 'Y',N'韻'
UNION ALL SELECT 'Z',N'咗'
) T
WHERE word>=@word COLLATE Chinese_PRC_CS_AS_KS_WS
ORDER BY PY ASC) ELSE @word END)
SET @str=right(@str,len(@str)-1)
END
RETURN @PY
END
使用方法:
select * from 表 where fun_getPY(字段) like N'%zgr%'
此方法是最快捷方便的,通過測(cè)試在文章表中搜索標(biāo)題首字母,其耗時(shí)大約為不使用此函數(shù)搜索的 3 倍,相信部署在小數(shù)據(jù)量的項(xiàng)目中的成本是非常低的。
LINQ 方式操作
初學(xué) LINQ 的朋友或許對(duì) .dbml 文件不是很熟悉,數(shù)據(jù)庫中的表可以直接拖動(dòng)到 .dbml 的左側(cè),而存儲(chǔ)過程、函數(shù)等可以直接拖到其右側(cè),然后就可以直接在邏輯使用了,下面是例子:
DataClasses1DataContext db = new DataClasses1DataContext();
var q = from d in db.Documents
where d.Title.Contains("zgr") || db.fun_getPY(d.Title).Contains("zgr")
select d;
方法二:在需要搜索的表中添加一個(gè)字段用于存放被檢索字段內(nèi)容對(duì)應(yīng)的拼音,在搜索的時(shí)候同時(shí)去查詢這兩個(gè)字段,這種方法可行,但會(huì)增加數(shù)據(jù)庫存放的大小。
方法三:在數(shù)據(jù)庫中建立一個(gè)函數(shù),在執(zhí)行查詢語句時(shí)通過此函數(shù)來轉(zhuǎn)化搜索,函數(shù)如下:
復(fù)制代碼 代碼如下:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: xoyozo
-- Create date: 2010-4-17
-- Description: 提供中文首字母
-- =============================================
CREATE FUNCTION fun_getPY
(
@str NVARCHAR(4000)
)
RETURNS NVARCHAR(4000)
AS
BEGIN
DECLARE @word NCHAR(1),@PY NVARCHAR(4000)
SET @PY=''
WHILE len(@str)>0
BEGIN
SET @word=left(@str,1)
SET @PY=@PY+(CASE WHEN unicode(@word) BETWEEN 19968 AND 19968+20901
THEN (SELECT TOP 1 PY FROM (
SELECT 'A' AS PY,N'驁' AS word
UNION ALL SELECT 'B',N'簿'
UNION ALL SELECT 'C',N'錯(cuò)'
UNION ALL SELECT 'D',N'鵽'
UNION ALL SELECT 'E',N'樲'
UNION ALL SELECT 'F',N'鰒'
UNION ALL SELECT 'G',N'腂'
UNION ALL SELECT 'H',N'夻'
UNION ALL SELECT 'J',N'攈'
UNION ALL SELECT 'K',N'穒'
UNION ALL SELECT 'L',N'鱳'
UNION ALL SELECT 'M',N'旀'
UNION ALL SELECT 'N',N'桛'
UNION ALL SELECT 'O',N'漚'
UNION ALL SELECT 'P',N'曝'
UNION ALL SELECT 'Q',N'囕'
UNION ALL SELECT 'R',N'鶸'
UNION ALL SELECT 'S',N'蜶'
UNION ALL SELECT 'T',N'籜'
UNION ALL SELECT 'W',N'鶩'
UNION ALL SELECT 'X',N'鑂'
UNION ALL SELECT 'Y',N'韻'
UNION ALL SELECT 'Z',N'咗'
) T
WHERE word>=@word COLLATE Chinese_PRC_CS_AS_KS_WS
ORDER BY PY ASC) ELSE @word END)
SET @str=right(@str,len(@str)-1)
END
RETURN @PY
END
使用方法:
復(fù)制代碼 代碼如下:
select * from 表 where fun_getPY(字段) like N'%zgr%'
此方法是最快捷方便的,通過測(cè)試在文章表中搜索標(biāo)題首字母,其耗時(shí)大約為不使用此函數(shù)搜索的 3 倍,相信部署在小數(shù)據(jù)量的項(xiàng)目中的成本是非常低的。
LINQ 方式操作
初學(xué) LINQ 的朋友或許對(duì) .dbml 文件不是很熟悉,數(shù)據(jù)庫中的表可以直接拖動(dòng)到 .dbml 的左側(cè),而存儲(chǔ)過程、函數(shù)等可以直接拖到其右側(cè),然后就可以直接在邏輯使用了,下面是例子:
復(fù)制代碼 代碼如下:
DataClasses1DataContext db = new DataClasses1DataContext();
var q = from d in db.Documents
where d.Title.Contains("zgr") || db.fun_getPY(d.Title).Contains("zgr")
select d;
您可能感興趣的文章:
相關(guān)文章
ASP.NET實(shí)現(xiàn)用戶注冊(cè)和驗(yàn)證功能(第4節(jié))
這篇文章主要介紹了ASP.NET實(shí)現(xiàn)用戶注冊(cè)和驗(yàn)證功能,學(xué)習(xí)ASP.NET驗(yàn)證控件的作用和使用方法,在此基礎(chǔ)上了解常用第三方控件,需要的朋友可以參考一下2015-08-08
xls表格導(dǎo)入數(shù)據(jù)庫功能實(shí)例代碼
這篇文章介紹了xls表格導(dǎo)入數(shù)據(jù)庫功能實(shí)例代碼,有需要的朋友可以參考一下2013-10-10
Asp.net簡(jiǎn)單實(shí)現(xiàn)給圖片增加文字水印
這篇文章主要介紹了Asp.net簡(jiǎn)單實(shí)現(xiàn)給圖片增加文字水印,需要的朋友可以參考下2014-12-12
ASP.NET WebAPI2復(fù)雜請(qǐng)求跨域設(shè)置的方法介紹
這篇文章主要給大家介紹了關(guān)于ASP.NET WebAPI2復(fù)雜請(qǐng)求跨域設(shè)置的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用ASP.NET具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
實(shí)例解析Java中的synchronized關(guān)鍵字與線程安全問題
首先要清楚的是synchronized鎖住的不是代碼而是對(duì)象,因而在編寫相關(guān)的代碼塊時(shí)要注意線程同步安全問題,下面就來以實(shí)例解析Java中的synchronized關(guān)鍵字與線程安全問題2016-06-06
如何為asp.net網(wǎng)站項(xiàng)目添加子項(xiàng)目
最近要給公司的電子商務(wù)網(wǎng)站添加個(gè)圈子的功能.網(wǎng)站功能本來就包含有新聞發(fā)布,會(huì)員管理,商品購物,后臺(tái)管理等,現(xiàn)在又要再加上圈子的功能,網(wǎng)站項(xiàng)目越來越復(fù)雜,每次編譯生成的dll超過100k.這樣每次修改任何一個(gè)功能中的任何一個(gè)小問題都要上傳整個(gè)dll,并導(dǎo)致整個(gè)website的首次訪問的重新編譯.2008-10-10

