asp.net 根据汉字的拼音首字母搜索数据库(附 LINQ 调用方法)

 更新时间:2010年04月25日 21:43:59   作者:  
我们经常需要使用拼音首字母来检索数据库,特别是应用于医院、商店等行业软件中。譬如搜索“zgr”就可以搜索所有包含“中国人”的记录。那么如果来实现才能即高效又方便呢?
方法一:先查询出所有记录,然后在逻辑层转化为拼音首字母后查询,显然傻瓜才会这么做。

方法二:在需要搜索的表中添加一个字段用于存放被检索字段内容对应的拼音,在搜索的时候同时去查询这两个字段,这种方法可行,但会增加数据库存放的大小。

方法三:在数据库中建立一个函数,在执行查询语句时通过此函数来转化搜索,函数如下:

复制代码 代码如下:

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'錯'
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%'



此方法是最快捷方便的,通过测试在文章表中搜索标题首字母,其耗时大约为不使用此函数搜索的 3 倍,相信部署在小数据量的项目中的成本是非常低的。

LINQ 方式操作
初学 LINQ 的朋友或许对 .dbml 文件不是很熟悉,数据库中的表可以直接拖动到 .dbml 的左侧,而存储过程、函数等可以直接拖到其右侧,然后就可以直接在逻辑使用了,下面是例子:
复制代码 代码如下:

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;

相关文章

  • ASP.NET实现用户注册和验证功能(第4节)

    ASP.NET实现用户注册和验证功能(第4节)

    这篇文章主要介绍了ASP.NET实现用户注册和验证功能,学习ASP.NET验证控件的作用和使用方法,在此基础上了解常用第三方控件,需要的朋友可以参考一下
    2015-08-08
  • .NET Core3.1编写混合C++程序

    .NET Core3.1编写混合C++程序

    这篇文章主要介绍了.NET Core3.1编写混合C++程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • xls表格导入数据库功能实例代码

    xls表格导入数据库功能实例代码

    这篇文章介绍了xls表格导入数据库功能实例代码,有需要的朋友可以参考一下
    2013-10-10
  • Asp.net简单实现给图片增加文字水印

    Asp.net简单实现给图片增加文字水印

    这篇文章主要介绍了Asp.net简单实现给图片增加文字水印,需要的朋友可以参考下
    2014-12-12
  • ASP.NET WebAPI2复杂请求跨域设置的方法介绍

    ASP.NET WebAPI2复杂请求跨域设置的方法介绍

    这篇文章主要给大家介绍了关于ASP.NET WebAPI2复杂请求跨域设置的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用ASP.NET具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07
  • 老生常谈.NET中的 COM 组件

    老生常谈.NET中的 COM 组件

    COM组件中的接口是一组由组件实现的,提供给客户使用的函数,这篇文章主要介绍了.NET中的 COM 组件,需要的朋友可以参考下
    2022-10-10
  • 实例解析Java中的synchronized关键字与线程安全问题

    实例解析Java中的synchronized关键字与线程安全问题

    首先要清楚的是synchronized锁住的不是代码而是对象,因而在编写相关的代码块时要注意线程同步安全问题,下面就来以实例解析Java中的synchronized关键字与线程安全问题
    2016-06-06
  • asp.net 图片超过指定大小后等比例压缩图片的方法

    asp.net 图片超过指定大小后等比例压缩图片的方法

    asp.net 图片超过指定大小后等比例压缩图片的方法,需要的朋友可以参考一下
    2013-05-05
  • 如何为asp.net网站项目添加子项目

    如何为asp.net网站项目添加子项目

    最近要给公司的电子商务网站添加个圈子的功能.网站功能本来就包含有新闻发布,会员管理,商品购物,后台管理等,现在又要再加上圈子的功能,网站项目越来越复杂,每次编译生成的dll超过100k.这样每次修改任何一个功能中的任何一个小问题都要上传整个dll,并导致整个website的首次访问的重新编译.
    2008-10-10
  • GMap.Net开发之自定义Marker使用方法

    GMap.Net开发之自定义Marker使用方法

    这篇文章主要介绍了GMap中Marker的使用方法,有需要的朋友可以参考一下
    2013-12-12

最新评论