Entity Framework 中使用SQL Server全文索引(Full Text Search)

GitHub:https://github.com/fissoft/Fissoft.EntityFramework.Fts

 

EntityFramework中原来使用全文索引有些麻烦,需要使用DbContext.Database.SqlQuery或Execute去直接执行SQL。那样不能靠编译来检查读法错误,重构也不方便。

不过EF6增加Interceptor,可以执行前置和后置操作。

Eg:

 public class FtsInterceptor : IDbCommandInterceptor
    {
        #region interface impl

        public void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
        {
        }

        public void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
        {
        }

        public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
        {
        }

        public void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
        {
        }

        public void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
        {

        }

        public void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
        {
        }

        #endregion
}

  与Filter或其它Aop框架差不多,这里提供了一共6个方法,分别是在ScalarExecute,NonQueryExecute,ReaderExecute 这三种查询 前置及后置操作

一般来说,使用全文索引是为了查询数据,所以ScalarExecute,ReaderExecute这两种查询的前置方法需要我们改写,具体改写的原理是,将DbCommand中的CommandText读取出来,然后处理成支持全文索引的格式。

细节请参考GitHub的代码:https://github.com/fissoft/Fissoft.EntityFramework.Fts

使用时按以下方法即可

1.通过Nuget引用,或下载GitHub上的代码编译

PM> Install-Package Fissoft.EntityFramework.Fts

2.然后在程序启动时执行以下读句添加拦截器

    DbInterceptors.Init()

3.执行查询时可以使用以下几种方法

    db.Tables.Where(c=>c.Fullname.Contains(FullTextSearchModelUtil.Contains("code")));
    db.Tables.Where(c=>c.Fullname.FreeText(FullTextSearchModelUtil.Contains("code ef")));
    db.Tables.Where(c=>"*".Contains(FullTextSearchModelUtil.ContainsAll("code ef")));
    db.Tables.Where(c=>"*".Contains(FullTextSearchModelUtil.FreeTextAll("code ef")));
				
时间: 2024-10-28 09:24:14

Entity Framework 中使用SQL Server全文索引(Full Text Search)的相关文章

Entity Framework中的全角半角符号问题

SQL Server的SQL查询不区分大小写,而LINQ查询区分大小写,所以在写LINQ代码时需要注意的是 --如果这段LINQ代码将会被Entity Framework解析为SQL语句(LINQ to Entities),则不 用考虑大小写问题:如果这段LINQ代码在内存中执行,就要考虑大小写的问题. 比如下面的LINQ to Entities(不用考虑大小写): //代码自来CNBlogsTagService _unitOfWork.Set<Tag>().Where(x => tag

在ASP中使用SQL Server和MSDE

server 作者系2月份微软社区之星Microsoft China Community Star 微软出品的SQL Server是Windows环境中常用的一种数据库服务器软件,也是ASP应用中经常用到的数据库之一.本文主要讲述SQL Server与ASP结合使用的一些技巧. 一.SQL Server的获取和安装 如果是商业应用,建议购买SQL Server的标准版或者企业版,价格2万多(比Windows还贵):如果是个人学习使用,或者财力有限,可以使用桌面版--MSDE.目前在.NET Fr

sql server全文索引,分词

问题描述 sql server全文索引,分词 sql全文索引,怎么进行整个数据库的搜索,中文进行分词,可以自己进行分词吗,如何分词,求大神赐教,谢谢! 解决方案 用HubbleDotNet http://www.cnblogs.com/ChengDong/archive/2012/09/20/2695413.html 解决方案二: 在一个产品介绍网站中查询产品时,由于产品的介绍性文字可能会很长,如果使用对产品介绍字段使用like进行模糊查询,性能肯定会是问题.那么如何解决这个问题呢?第一个想法就

sql server全文索引的性能问题

Sql Server 全文索引的性能一直都不是太好,今天听同事分享,发现了一个技巧,回去试了下,发现确实能明显的提升全文索引的性能,一般都能提升 2倍+   原 SQL 语句: select * from Table1 where Contants(*,'test') 优化后的 SQL 语句: view sourceprint?select * from Table1 where Contains((Content,Title),'test')   两条 SQL 的不同之处,就是在 Contan

搞定C#中列举出局域网中的SQL SERVER服务器

server|服务器 用先添加SQLDMO对象的引用,SQLDMO是COM对象,不是.NET对象下面这个函数返回局域网中的SQL SERVER服务器的列表数组.private string[] Getallservers()        {            string[] servers;            SQLDMO.NameList num;            SQLDMO.ApplicationClass rs=new SQLDMO.ApplicationClass()

在ASP.NET中访问SQL Server

asp.net|server|访问 在ASP.NET中访问SQL Server数据库有两种方法,它们是System.Data.OleDb和System.Data.SqlClient.下面这段程序以System.Data.SqlClient为例访问本地数据库服务器. 首先导入名字空间:System.Data和System.Data.SqlClient.详细代码看源程序.<%@ Import Namespace="System.Data" %><%@ Import Nam

配置-asp.net中绑定sql server问题

问题描述 asp.net中绑定sql server问题 您好,我的数据库连接是在web.config中配置的,但是程序中的有些代码不懂. 打个比方:我的数据库里有一个名为ThingType的表格,有这样的一句 Repeater1.DataSource = ThingTypeMananger.Get(); 这是采用了什么原理的,哪位前辈给我说一下,谢谢 解决方案 Repeater1是一个asp.net webform服务器端控件,控件都有一个特点就是数据绑定机制,即通过数据源绑定实现数据的展示.

在Entity Framework中使用存储过程(二):具有继承关系实体的存储过程如何定义?

在<实现存储过程的自动映射>中,我通过基于T4的代码生成实现了CUD存储过程的自动映射.由于映射的都是基于数据表结构的标准的存储过程,所以它们适合概念模型和存储模型结构相同的场景.如果两种模型存在差异,在进行数据更新操作的时候就会出错.本篇文章主要介绍当概念模型中具有继承关系的两个实体映射到数据库关联的两个表,如何使用存储过程. 目录 一.创建具有继承关系的实体 二.基于继承关系实体的查询与更新 三.映射标准的CUD存储过程 四.修正存储过程 一.创建具有继承关系的实体 假设数据库中有如下两个

sql-在Csharp中实现SQL Server数据库中的UniqueIdentifier数据类型

问题描述 在Csharp中实现SQL Server数据库中的UniqueIdentifier数据类型 实现对数据库的条件查询表结构:表数据示例:错误信息:1.2. 解决方案 你注意,一个是lid,一个是selllistno,不是一个字段,前者是guid 解决方案二: 你这个是流水号,一个string,不是guid,没法转,用string就可以了. 解决方案三: 解决方案四: uniqueidentifier数据类型可存储16字节的二进制值,其作用与全局唯一标记符(GUID)一样.GUID是唯一的