我正在使用 Entity Framework 4.2 Code First 和 MySQL。我需要能够对表格的多个字段进行全文搜索。但是,我对此有很多问题:
1)MySQL下全文搜索需要MyISAM表类型。但是,当我运行 DropCreateDatabaseAlways 初始化程序时,我得到的表类型是 InnoDB。这是我的表定义的示例:
[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)我需要指定全文索引:
ALTER TABLE `patient` ADD FULLTEXT INDEX `Name`(`FirstName`, `LastName`);
我能想到的一种可能性是:
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 列表或 Patient 行列表。例如:
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 {...}
或者:
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)?
有任何想法吗?
提前致谢,
担