2016-04-27 26 views
1

可以使用Npgsql和Entity Framework 6查詢PostgreSQL忽略重音嗎?在遊戲中SQL有可能使用unaccent擴展,可以用一個指標也位於unaccent索引:使用Npgsql和實體框架查詢PostgreSQL使用unaccent

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

在使用MySQL,我可以只使用一個排序規則不區分重音像utf8_swedish_ci但PostgreSQL的缺乏解決這個問題,以前的項目據我所知這種解決方案。

+0

您使用什麼EF方法? – PiKos

回答

4

如果使用Codefirst的方法,你應該嘗試使用EntityFramework.CodeFirstStoreFunctions

  1. 首先添加EntityFramework.CodeFirstStoreFunctions到項目
  2. 添加自定義的公約,unaccent到DbModelBuilder
  3. 使用它的查詢。數據庫上下文的

實施例:

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(); 

重要聲明:
此解決方案的工作原理與EntityFramework6.Npgsql(使用3 Npgsql的* )。
它不適用於Npgsql.EntityFramework(它使用Npgsql 2. *)

+0

我得到「不支持指定的方法」。 –

+1

@IanWarburton我需要關於這個異常的更多細節。你能粘貼完整的堆棧跟蹤嗎?你有什麼版本的EntityFramework,EntityFramework6.Npgsql和Npgsql? – PiKos

+0

EF 6,Npgsql 2.2.5。 Npgsql.SqlGenerators.SqlBaseGenerator.VisitFunction(EdmFunction函數,IList'1參數,TypeUsage結果類型)與'System.Data.Entity.Core.EntityCommandCompilationException'發生故障 –