【发布时间】:2010-11-26 10:19:20
【问题描述】:
我一直在查看以下内容,使用编译查询似乎可以获得很大的好处... http://blogs.msdn.com/ricom/archive/2008/01/14/performance-quiz-13-linq-to-sql-compiled-query-cost-solution.aspx
我的问题是我想对我的查询进行单元测试,但编译后的查询需要一个派生自 DataContext 的类的具体实例(这特别难以模拟出来)......因此我想出了以下代码我想知道是否有人知道我是否仍然应该获得编译查询的性能优势......
private static readonly Func<IDatabase, IActionParameters, ISportProgramMapper, IQueryable<ISportProgram>> _GetQueryUnCompiled =
(db, parameters, mapper) => from x in db.SportProgramDataSource.ThatHaveActiveSports()
where x.SportProgramId == parameters.Id
select mapper.FromDataToEntity(x);
private static readonly Func<Database, IActionParameters, ISportProgramMapper, IQueryable<ISportProgram>> _GetQuery = CompiledQuery.Compile<Database, int, ISportProgramMapper, IQueryable<ISportProgram>>((db, parameters, mapper) => _GetQueryUnCompiled(db, parameters, mapper));
public IActionResult<ISportProgram> Get(IActionParameters parameters)
{
Check.Argument("parameters").ThatValue(parameters).IsNotNull();
IDatabase db = this.CreateDatabase();
ISportProgramMapper mapper = this.CreateMapper<ISportProgramMapper>();
Database typedDb = db as Database;
var result = typedDb != null ? _GetQuery(typedDb, parameters, mapper).FirstOrDefault() : _GetQueryUnCompiled(db, parameters, mapper).FirstOrDefault();
return this.CreateActionResult(result);
}
请注意,在单元测试场景中,我的 db 不会是 Database 类型,这意味着它将调用未编译的版本,在 prod 场景中,它将是 Database 类型并运行已编译的版本。
干杯 安东尼
更新: 好的,即使我确实重构了代码,以便我当前在 DAL 中的方法使用返回 IQueryable 的存储库,基础问题仍然存在,使用已编译查询的存储库版本将包装包含原始查询的版本,以与我目前正在做的类似的方式......使用 _GetQuery 调用 _GetQueryUnCompiled 的模式,我仍然可以获得性能优势吗?
【问题讨论】:
-
你有没有想过这是否有效?我正在考虑做同样的事情。
标签: c# unit-testing linq-to-sql mocking datacontext