我正在使用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)?
有什么想法吗?
提前致谢,
丹
答案 0 :(得分:1)
ALTER TABLE
来更改引擎。SqlQuery
并填充与结果集具有相同属性的类型。[Column(TypeName="VARCHAR(50)]
注释。答案 1 :(得分:0)
如果您是MySQL用户的dotConnect,我们建议您查看 this article。如果您使用其他提供商,我们建议您与其供应商联系。