2016-04-27 2 views
1

Возможно использование Npgsql и Entity Framework 6 для запроса PostgreSQL, игнорирующего акценты? В игровой SQL это можно использовать unaccent расширение и может быть индексированы с индексом также базирующегося в unaccent:Запрос PostgreSQL с Npgsql и Entity Framework с использованием unaccent

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

В предыдущих проектах с использованием MySql я мог бы решить эту проблему только с помощью сверка акцент INSENSITIVE как 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 (который использует Npgsql 3. *).
Он не работает с 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 args, TypeUsage resultType) с 'System.Data.Entity.Core.EntityCommandCompilationException' –

Смежные вопросы