首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MySql和Entity Framework4.2代码中使用全文搜索?

问如何在MySql和Entity Framework4.2代码中使用全文搜索?
EN

Stack Overflow用户
提问于 2012-08-20 06:41:18
回答 2查看 938关注 0票数 2

我使用的是实体框架4.2 Code First和MySQL。我需要能够在我的表的几个字段中执行全文搜索。然而,我对此有一些问题:

1) MySQL下的全文检索需要MyISAM表类型。但是,当我运行DropCreateDatabaseAlways初始化器时,我得到的表类型是InnoDB。下面是我的表定义的一个示例:

代码语言:javascript
复制
[Table("Patient")]
[Serializable]
public class Patient
{
    public Patient()
    {
    }

    [Key]
    public int PatientID { get; set; }

    [MaxLength(50)]
    public string FirstName { get; set; }
    [MaxLength(50)]
    public string LastName { get; set; }
}

是否可以指定MyISAM表类型?如果是这样的话,是怎么做的?

2)我需要指定全文索引:

代码语言:javascript
复制
ALTER TABLE `patient` ADD FULLTEXT INDEX `Name`(`FirstName`, `LastName`);

我能想到的一种可能性是:

代码语言:javascript
复制
public class MyDbInitializer : DropCreateDatabaseAlways<MyDbContext>
{
    protected override void Seed(MyDbContext context)
    {
        context.Database.ExecuteSqlCommand(
            "ALTER TABLE `patient` ADD FULLTEXT INDEX `Name`(`FirstName`, `LastName`)");
    }
}

有没有更好的方法?

3)我需要能够使用全文索引进行搜索。理想情况下,以与我现有的linq to SQL协同工作的方式。

我能想到的一种不太理想的可能性是创建一个存储过程(同样使用ExecuteSqlCommand),该存储过程接受一个字符串并返回匹配PatientID的列表或患者行的列表。例如:

代码语言:javascript
复制
IEnumerable<int> patientIDs = [...call stored proc to get matching ids...]
var patients = from p in patients 
               where patientIDs.Any(pid => pid == p.PatientID) 
               select new {...}

或者:

代码语言:javascript
复制
var patients = from p in [...call stored proc to get matching patient records...]
               select new {...}

我该怎么做呢?有没有更好的方法?

4)额外的问题:即使我指定了MaxLength(50)属性,我的字符串仍被存储为MEDIUMTEXT而不是我期望的VARCHAR(50)。如果没有MaxLength属性,我会得到LONGTEXT。如何为字符串类型指定VARCHAR(n)?

有什么想法吗?

提前谢谢你,

丹

EN

回答 2

Stack Overflow用户

发布于 2012-08-20 16:50:46

  1. 它是特定于提供者的,所以除非您的MySQL提供者提供了一些方法来更改它,否则您将无法首先从代码中进行更改。我认为你应该能够在自定义的DB初始化器中运行ALTER TABLE来改变引擎。
  2. 如果你使用迁移功能(EF 4.3和更新版本),你可以在迁移中编写索引脚本,否则你需要使用你的SQL来查询数据库。EF不支持全文搜索查询。若要调用存储过程,必须使用SqlQuery并使用与结果集相同的属性填充类型。
  3. 尝试使用[Column(TypeName="VARCHAR(50)]批注。
票数 1
EN

Stack Overflow用户

发布于 2012-08-21 14:48:59

如果你是MySQL的dotConnect用户,我们建议你去看看 this article。如果您使用其他提供商,我们建议您与其供应商联系。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12030555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档