c# - 为什么这个 CompiledQuery 没有提供性能改进?

标签 c# performance entity-framework compiled-query

我正在尝试加快常用查询的速度。使用 CompiledQuery 似乎是答案。但是当我尝试编译版本时,编译版本和非编译版本之间的性能没有差异。

有人能告诉我为什么使用 Queries.FindTradeByTradeTagCompiled 并不比使用 Queries.FindTradeByTradeTag 快吗?

static class Queries
{
    // Pre-compiled query, as per http://msdn.microsoft.com/en-us/library/bb896297
    private static readonly Func<MyEntities, int, IQueryable<Trade>> mCompiledFindTradeQuery =
        CompiledQuery.Compile<MyEntities, int, IQueryable<Trade>>(
            (entities, tag) => from trade in entities.TradeSet
                               where trade.trade_tag == tag
                               select trade);

    public static Trade FindTradeByTradeTagCompiled(MyEntities entities, int tag)
    {
        IQueryable<Trade> tradeQuery = mCompiledFindTradeQuery(entities, tag);

        return tradeQuery.FirstOrDefault();
    }

    public static Trade FindTradeByTradeTag(MyEntities entities, int tag)
    {
        IQueryable<Trade> tradeQuery = from trade in entities.TradeSet
                                       where trade.trade_tag == tag
                                       select trade;

        return tradeQuery.FirstOrDefault();
    }
}

最佳答案

感谢 orandov,我找到了答案 here (在最后)。如果您对查询进行任何更改,预编译语句将被丢弃。就我而言,FirstOrDefault()正在更改基础查询。

解决方案是调用 AsEnumerable()首先在查询上。调用AsEnumerable()预编译查询受到保护,FirstOrDefault()根据结果​​在本地执行(针对 Linq.Enumerable.FirstOrDefault 而不是 Linq.Queryable.FirstOrDefault 调用)。

最终结果:执行时间从 45 毫秒减少到 4 毫秒。快 11 倍。

public static Trade FindTradeByTradeTagCompiled(MyEntities entities, int tag)
{
    IQueryable<Trade> tradeQuery = mCompiledFindTradeQuery(entities, tag);

    return tradeQuery.AsEnumerable().FirstOrDefault();
}

关于c# - 为什么这个 CompiledQuery 没有提供性能改进?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2626152/

相关文章:

python - Python中类似代码的速度差异

c# - 无法确定 OR “Value cannot be null, parameter name ' 键的主体端'”

c# - 在 DataGridViewComboBoxColumn 中设置 selectedValue

c# - 异步命令模式——异常处理

linux - 是否对 10000 个客户端/秒问题的解决方案进行了现代审查

c# - 此存储库模式对于 LINQ-to-SQL 有效吗?

c# - 如何将 "Provider Connection String"与 EF (EDMX) 元数据信息分开?

asp.net - Web.config 中使用附加 .mdf 数据库的数据库连接字符串不起作用

c# - Protocol Buffer 反序列化和动态加载的 DLL

c# - 为泛型写一个扩展方法