web-dev-qa-db-fra.com

Recherche plein texte dans EF Core 2.1?

Je cherche à utiliser la recherche en texte intégral, mais je ne sais pas à 100% comment l'obtenir avec EF Core 2.1.

Il semble que EF Core 2.1 ait pu implémenter une prise en charge partielle de la recherche en texte intégral, mais je ne trouve aucun didacticiel sur la façon de l'utiliser réellement.

Je crois comprendre que je devrai ajouter un index de texte intégral à l'une de mes colonnes.

Donc, si j'ai cette table

public class Company {
    public string Name {get; set;}
}

public class CompanyConfig : IEntityTypeConfiguration<Company>
{
  public void Configure(EntityTypeBuilder<Company> builder)
        {
            builder.HasKey(x => x.Id);
            builder.Property(x => x.Name).HasMaxLength(100).IsRequired();
        }

}

Comment ajouter un index de texte intégral à ma propriété Name?

12
chobo2

Vous devez les ajouter manuellement pour l'instant en utilisant la fonction SQL dans les migrations.

La création d'index de texte intégral n'est pas encore construite, à partir d'EF Core 2.1. Voir ce suivi des problèmes pour plus de détails https://github.com/aspnet/EntityFrameworkCore/issues/11488 .

En résumé;

Dans EF Core 2.1, nous avons une prise en charge initiale pour la recherche en texte intégral via le prédicat FreeText dans LINQ, mais cela ne fonctionne qu'avec les bases de données qui ont déjà été indexées. EF Core et le fournisseur SQL Server ne fournissent aucun moyen de configurer le modèle afin que les migrations ou EnsureCreated puissent générer le SQL approprié pour définir les index.

Un exemple de requête C # Linq pour FreeText, extrait des tests sur https://github.com/aspnet/EntityFrameworkCore/commit/2a6ccad8821f9360ae753bce41d63811185b8912 ;

using (var context = CreateContext())
{
    var result = await context
        .Employees
        .Where(c => EF.Functions.FreeText(c.Title, "Representative"))
        .ToListAsync(); 

        Assert.Equal(result.First().EmployeeID, 1u);

        Assert.Equal(
            @"SELECT [c].[EmployeeID], [c].[City], [c].[Country], [c].[FirstName], [c].[ReportsTo], [c].[Title] FROM [Employees] AS [c] WHERE FREETEXT([c].[Title], N'Representative')",
                    Sql,
                    ignoreLineEndingDifferences: true,
                    ignoreWhiteSpaceDifferences: true);
}
11
Ryan O'Neill