【问题标题】:Entity Framework Compiled Query实体框架编译查询
【发布时间】:2012-03-16 15:18:44
【问题描述】:

如何将此实体框架 LINQ 查询编写为编译查询?

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

【问题讨论】:

    标签: linq entity-framework


    【解决方案1】:

    在使用 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

    【讨论】:

    • 对于不是代码的 EF5,是否可以使用 DbContext 包装的底层 ObjectContext 来使用 CompiledQuery?
    【解决方案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()
        );
    

    【讨论】:

    • 有什么方法可以使所有实体的属性 Compiled_GetById 通用,而不仅仅是商店实体?这对我有很大帮助,谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多