我有一个带存储库模式的应用。它允许我通过LINQ操作对象,对象存储在内存中,因此我可以非常快速地访问它们。这是一个示例代码:
private Measurement ParseExact(AgentParameter agentParameter)
{
ControlledElement ce;
using (var repositoryBase = Datastore.GetRepository<ControlledElement>())
{
var mvId = Convert.ToInt32(agentParameter.ControlledParameterId);
var sId = Convert.ToInt32(agentParameter.FacilityId);
ce =
repositoryBase.Query(
t => t.FirstOrDefault(elem => elem.Sensor.Id == sId && elem.MeasuringValue.Id == mvId));
}
}
当我使用dotTrace分析我的代码时,我发现在高负载下,我在创建委托elem => elem.Sensor.Id == sId && elem.MeasuringValue.Id == mvId
时表现不佳。我的查询方法如下:
public TOut Query<TOut>(Func<IQueryable<TEntity>, TOut> specification)
这意味着,每次使用它时我都会传递一个Func<>
对象。所以,问题是,我该如何优化呢?
答案 0 :(得分:4)
您可以通过显式跟踪对象中的状态来消除编译步骤,而不是使用闭包。
private Measurement ParseExact(AgentParameter agentParameter)
{
ControlledElement ce;
using (var repositoryBase = Datastore.GetRepository<ControlledElement>())
{
var mvId = Convert.ToInt32(agentParameter.ControlledParameterId);
var sId = Convert.ToInt32(agentParameter.FacilityId);
var query = new ParseExactQuery(mvId, sId);
ce = repositoryBase.Query(t => t.FirstOrDefault(query.Query));
}
}
private class ParseExactQuery {
private int mvId;
private int sId;
public ParseExactQuery (int mvId, int sId) {
this.mvId = mvId;
this.sId = sId;
}
public bool Query(ControlledElement elem) {
return elem.Sensor.Id == sId && elem.MeasuringValue.Id == mvId;
}
}