2012-03-16 96 views
4

如何將此實體框架LINQ查詢編寫爲編譯查詢?實體框架編譯查詢

var context = new SlxDbContext(); 
var userSet = context.Set<User>(); 
User user = userSet.Where(x => x.UserName == "gstrader").First(); 

回答

2

不幸的是EF的版本使用的是(代碼首先),不支持編譯查詢。

如果我錯了,請糾正我。

一些鏈接:

How do I precompile an Entity Framework Code-First Query?

EF Code First DbContext and Compiled Queries

http://blogs.msdn.com/b/adonet/archive/2011/03/02/ef-4-1-is-coming-dbcontext-api-amp-code-first-rtw.aspx

UPDATE:

這裏是編譯查詢的樣本,但我認爲它不會與代碼工作第一批:

public static Shop CompiledGetShopById(Guid shopId) 
{ 
    using (DataContext dtx = new DataContext(ConfigProvider.ConnectionString)) { 
     return Compiled_GetById.Invoke(dtx, shopId); 
    } 

} 

private static Func<DataContext, Guid, Shop> Compiled_GetById = 
    Objects.CompiledQuery.Compile<DataContext, Guid, Shop>(
     (DataContext db, Guid shopId) => 
      (from item in db.Shops where item.ShopId == shopId) 
      .FirstOrDefault() 
    ); 
+0

有什麼辦法如何使財產的所有實體,不只是實體店通用Compiled_GetById?這將幫助我很多,謝謝:) – 2013-10-20 12:07:37

5

當您使用DbContext API時,無法使用CompiledQuery; CompiledQuery僅適用於ObjectContext。如果您使用的是Code First,則很可能使用DbContext API。而且,即使您將使用Database First或Model First模型,Microsoft建議您在新項目中使用DbContext API。

但是如果你使用EF5,它帶來自動編譯查詢,這工作比CompiledQuery非常不同。而不是編寫每個查詢的編寫代碼,然後根據需要調用每個查詢,EF5會將生成的SQL緩存爲後臺進程,然後在執行任何查詢時搜索緩存中已編譯的查詢。

參見:

http://blogs.msdn.com/b/adonet/archive/2012/02/14/sneak-preview-entity-framework-5-0-performance-improvements.aspx

http://www.devproconnections.com/article/entity-framework/entity-framework-5-143875

+0

對於不是代碼的EF5可以使用由DbContext包裝的底層ObjectContext來使用CompiledQuery? – 2014-02-24 23:12:52