我正在尝试加快常用查询的速度。使用 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/