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`);
私が考えることができる1つの可能性は次のとおりです。
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 と連携する方法で。
私が考えることができる 1 つのあまり望ましくない可能性は、文字列を受け取り、一致する患者 ID のリストまたは患者の行のリストのいずれかを返すストアド プロシージャを (ここでも ExecuteSqlCommand を使用して) 作成することです。例えば:
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)] 属性を指定しても、予想どおり、文字列は VARCHAR(50) ではなく MEDIUMTEXT として保存されます。[MaxLength] 属性がないと、LONGTEXT になります。文字列型に VARCHAR(n) を指定するにはどうすればよいですか?
何か案は?
前もって感謝します、
ダン