2011-02-18 91 views
9

我有一個表Personid, name添加索引的表

我經常有這樣的查詢:

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

我有2個問題:

  1. 我如何使用實現這個查詢代碼優先5(CTP5)
  2. 如何在名稱列上添加一個索引,以便像查詢中那樣根據名稱更快地檢索數據?

回答

22

Like運算符可以執行具有包含功能:

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

指數必須由SQL添加 - 沒有特殊的建設EF創建索引。您可以從數據庫初始化中執行此SQL。

首先,你必須實現自定義的初始化:

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

然後,你必須註冊新的初始化:

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

我會期待使用`Seed()`接種數據,我認爲sql命令應該在`DbMigration.Up()`中執行。我嘗試在`Up()`方法中訪問dbContext,但沒有運氣,但是我發現有'DbMigration.Sql()`。好像在我的`Up()`中,我可以調用`this.Sql(「CREATE INDEX IX_Person_Name ON Person(Name)」)`。我在正確的軌道? – CallMeLaNN 2012-10-19 08:02:20

0

在EF 6,你可以創建索引,這樣

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