实体框架编译查询

时间:2012-03-16 15:18:44

标签: linq entity-framework

如何将此Entity Framework LINQ查询编写为编译查询?

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

2 个答案:

答案 0 :(得分:5)

当您使用DbContext API时,无法使用CompiledQuery; CompiledQuery仅适用于ObjectContext。如果您使用的是Code First,则最有可能使用DbContext API。 Microsoft建议您在新项目中使用DbContext API,即使您将使用Database First或Model First模型。

但是如果你使用 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

答案 1 :(得分: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

更新:

以下是编译查询的示例,但我认为它不适用于Code First:

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()
    );