2016-04-27 20 views
1

アクセントを無視したクエリPostgreSQLにはNpgsqlとEntity Framework 6を​​使用できますか?プレイSQLではunaccent拡張子を使用することが可能ですし、またunaccentに基づいて、インデックスを使用してインデックスを作成することができます:私はちょうどutf8_swedish_ciのような照合アクセント小文字を区別しないを使用しますが、PostgreSQLが欠けているこの問題を解決する可能性がMySQLを使用して、以前のプロジェクトでunaccentを使用したNpgsqlとEntity Frameworkを使用したPostgreSQLの照会

select * from users where unaccent(name) = unaccent('João') 

私が知る限り、この種の解決策。

+0

どのようなEFアプローチを使用していますか? – PiKos

答えて

4

あなたはCodefirstアプローチを使用する場合は、EntityFramework.CodeFirstStoreFunctionsを使用するようにしてください。

  1. まず、プロジェクト
  2. にEntityFramework.CodeFirstStoreFunctionsを追加DbModelBuilder
  3. unaccentでカスタム規則を追加
  4. は、クエリでそれを使用してください。データベースコンテキストの

例:使用の

public class DatabaseContext : DbContext 
{ 
    public DatabaseContext() : base("Context") 
    { 
     Database.SetInitializer<DatabaseContext>(null); 
    } 

    public DbSet<User> Users { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.HasDefaultSchema("public"); 
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 

     /** Adding unaccent **/   
     modelBuilder.Conventions.Add(new CodeFirstStoreFunctions.FunctionsConvention<DatabaseContext>("public")); 
    } 

    [DbFunction("CodeFirstDatabaseSchema", "unaccent")] 
    public string Unaccent(string value) 
    { 
     // no need to provide an implementation 
     throw new NotSupportedException(); 
    } 
} 

例:

var users = ctx.Users 
       .Where(elem => ctx.Unaccent(elem.FirstName) == ctx.Unaccent("João")) 
       .ToList(); 

重要な注意事項:
この溶液はNpgsqlの3使用EntityFramework6.Npgsql(と連携* )。
これは動作しませんNpgsql.EntityFramework(Npgsql 2を使用)*

+0

「指定されたメソッドはサポートされていません」というメッセージが表示されます。 –

+1

@IanWarburton私はこの例外についてさらに詳しく知る必要があります。完全なスタックトレースをペーストできますか? EntityFramework、EntityFramework6.Npgsql、Npgsqlのどのバージョンがありますか? – PiKos

+0

EF 6、Npgsql 2.2.5。 'System.Data.Entity.Core.EntityCommandCompilationException'でNpgsql.SqlGenerators.SqlBaseGenerator.VisitFunction(EdmFunction関数、IList'1 args、TypeUsage resultType)に失敗しました –

関連する問題