2011-02-18 2 views
9

J'ai une table Person: id, nameAjout d'index à une table

J'ai souvent des requêtes telles que:

select * from Person where name Like "%abc%". 

J'ai 2 questions:

  1. Comment puis-je mettre cette requête en utilisant code-first 5 (CTP5)
  2. Comment est-ce que j'ajoute un index sur la colonne de nom pour rendre la récupération de données plus rapide basée sur le nom comme dans la requête?

Répondre

22

Comme l'opérateur peut être effectué avec fonction contains:

var query = from p in context.Persons 
      where p.Name.Contains("abc") 
      select p; 

index doit être ajoutée par SQL - il n'y a pas de construction spéciale EF pour créer l'index. Vous pouvez exécuter ce SQL à partir de l'initialisation de la base de données.

D'abord, vous devez mettre en œuvre initialiseur personnalisée:

public class MyInitializer : CreateDatabaseIfNotExists<MyContext> 
{ 
    protected override void Seed(MyContext context) 
    { 
    context.Database.SqlCommand("CREATE INDEX IX_Person_Name ON Person (Name)"); 
    } 
} 

Ensuite, vous devez enregistrer le nouvel initialiseur:

DbDatabase.SetInitializer<MyContext>(new MyInitializer()); 
+5

J'attendrai utiliser 'Seed()' pour ensemencer des données et je pense que la commande sql devrait être effectuée dans 'DbMigration.Up()'. J'essaie d'accéder à dbContext dans la méthode 'Up()' mais pas de chance, mais j'ai trouvé qu'il y a 'DbMigration.Sql()'. On dirait que dans mon 'Up()', je peux appeler 'this.Sql (" CREATE INDEX IX_Person_Name ON Personne (Nom) ")'. suis-je dans une bonne voie? – CallMeLaNN

+6

@CallMeLaNN: Oui. Cette question a été répondue longtemps avant les migrations ont été libérées. Lorsque vous utilisez des migrations, vous devez placer la commande SQL dans la méthode 'Up' de votre migration. –

+0

Où appeler 'SetInitializer'? –

0

dans EF 6, vous pouvez créer des index comme celui-ci

Property(t => t.TotalValue) 
      .HasColumnAnnotation(
       IndexAnnotation.AnnotationName, 
       new IndexAnnotation(new IndexAttribute("IX_inventory_import_total_value", 1)) 
      ); 
Questions connexes