ホーム > 未分類 > あれ??CodeFirstで照合順序はどこで指定するの???

あれ??CodeFirstで照合順序はどこで指定するの???


SQL Server Compact 4.0+コードファーストを採用しているプロジェクトがあるんだけれど、検索結果が予想したものにならないんだけれどと相談を受けました。

とりあえずこんなコードがあるとして

Using context = New LocalDbContext()
    context.マスター.Add(New マスター With {.Name = "かきくけこ"})
    context.マスター.Add(New マスター With {.Name = "ほげあほげ"})
    context.マスター.Add(New マスター With {.Name = "ほげアほげ"})
    context.マスター.Add(New マスター With {.Name = "ほげアほげ"})
    context.マスター.Add(New マスター With {.Name = "あいうえお"})
    context.マスター.Add(New マスター With {.Name = "いうえおあ"})
    context.マスター.Add(New マスター With {.Name = "さしすせそ"})
    context.マスター.Add(New マスター With {.Name = "a"})
    context.マスター.Add(New マスター With {.Name = "A"})
    context.マスター.Add(New マスター With {.Name = "ほげAほげ"})
    context.マスター.Add(New マスター With {.Name = "ほげAあほげ"})
    context.SaveChanges()
End Using

Using context = New LocalDbContext()
    Console.WriteLine("■あが含まれるもの")
    For Each item In context.マスター.Where(Function(n) n.Name.Contains("あ"))
        Console.WriteLine(item.Id & ":" & item.Name)
    Next

    Console.WriteLine("■aが含まれるもの")
    For Each item In context.マスター.Where(Function(n) n.Name.Contains("a"))
        Console.WriteLine(item.Id & ":" & item.Name)
    Next
End Using

実行するとこうなるらしい。

image

みごとに大文字・小文字、半角・全角、かな・カタカナが区別されずに出ちゃっていますね。照合順序が問題なのは分かるんですけれどCodeFirstの場合、照合順序ってどうやって指定するんでしょう。。。

サポートされる照合順序 (SQL Server Compact)をみると、サーポートされている照合順序はJapanese_CI_ASとJapanese_CS_ASだけみたい。あれ?かなとカタカナは?半角と全角は??

嫌な予感がしつつも、とりあえず照合順序の使用 (SQL Server Compact)をみると、接続文字列に Case Sesitiveを指定すると大文字と小文字は区別してくれるみたいなので、まずはこっちを確認してみます。appConfigに接続文字列を追加して実行してあげます。

<connectionStrings>
  <add name="LocalDbContext"
       connectionString="Data Source=|DataDirectory|LocalDb.sdf;Case Sensitive=True"
       providerName="System.Data.SqlServerCe.4.0"/>
</connectionStrings>  <entityFramework>

image

確かに大文字・小文字と英字の半角・全角は区別されたようですが、日本語はかな・カタカナ、半角・全角は区別されずに出てきちゃっていますね。Kanji SensitiveとかWide Sensitiveとか無いんでしょうか。。。

とりあえず今回は件数が少ないので.NET側でフィルターしようかと思います。これほんとにこれしかやり方ないんでしょうか。。。

Using context = New LocalDbContext()
    Dim tmp = context.マスター.ToList()
    Console.WriteLine("■あが含まれるもの")
    For Each item In tmp.Where(Function(n) n.Name.Contains("ア"))
        Console.WriteLine(item.Id & ":" & item.Name)
    Next

    Console.WriteLine("■aが含まれるもの")
    For Each item In tmp.Where(Function(n) n.Name.Contains("a"))
        Console.WriteLine(item.Id & ":" & item.Name)
    Next
End Using

広告
カテゴリー:未分類
  1. まだコメントはありません。
  1. No trackbacks yet.

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。