繁体   English   中英

单元测试,Linq to SQL和解决数据上下文

[英]Unit Testing, Linq to SQL and working around the Data Context

我一直在研究以下内容,看起来使用编译查询可以获得很多好处... http://blogs.msdn.com/ricom/archive/2008/01/14/performance-quiz- 13 LINQ到SQL编译查询成本,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);
}

请注意,在单元测试场景中,我的数据库不是类型数据库,这意味着它将调用未编译的版本,在prod场景中它将是数据库类型并将运行编译版本。

干杯安东尼

更新:好的,即使我重构代码,以便我当前在DAL中的方法使用返回IQueryable的存储库仍然保留基础问题,使用编译查询的存储库版本将包装一个包含原始查询,与我目前正在进行的方式类似...使用_GetQuery调用_GetQueryUnCompiled的模式我还能获得性能优势吗?

只是一个想法,你能重构只能通过分层使用IEnumerable<>吗? 这样,您可以与查询分开测试数据库代码吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM