2012-03-16 127 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