2011-02-18 17 views
9

Tengo una tabla Person: id, nameAdición de índice para una tabla

que a menudo tienen preguntas como:

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

tengo 2 preguntas:

  1. ¿Cómo implementar esta consulta utilizando código-primero 5 (CTP5)
  2. ¿Cómo agrego un índice en la columna de nombre para acelerar la recuperación de datos en base al nombre como en la consulta?

Respuesta

22

Al igual que el operador puede llevar a cabo con la función contiene:

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

hay que añadir por SQL - no hay ninguna construcción especial de EF para crear el índice. Puede ejecutar este SQL desde la inicialización de la base de datos.

primer lugar hay que aplicar inicializador personalizado:

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

a continuación, debe registrar la nueva inicializador:

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

voy a esperar para usar 'Seed()' para sembrar datos y creo que el comando sql debe ejecutarse en 'DbMigration.Up()'. Intento acceder a dbContext en el método 'Up()' pero no tuve suerte, pero encontré que 'DbMigration.Sql()'. Parece que en mi 'Arriba()', puedo llamar a 'this.Sql (" CREATE INDEX IX_Person_Name ON Person (Name) ")'. estoy en el camino correcto? – CallMeLaNN

+6

@CallMeLaNN: Sí. Esta pregunta fue respondida mucho tiempo antes de que se lanzaran las migraciones. Al usar migraciones, debe colocar el comando SQL en el método 'Arriba' en su migración. –

+0

¿Dónde llamar a 'SetInitializer'? –

0

en EF 6, se pueden crear índices como esto

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