c# - 单元测试、Linq to SQL 和围绕数据上下文工作

标签 c# unit-testing linq-to-sql mocking datacontext

我一直在查看以下内容,似乎使用编译查询可以获得很大的好处...... 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);
}

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

干杯 安东尼

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

最佳答案

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

关于c# - 单元测试、Linq to SQL 和围绕数据上下文工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1392618/

相关文章:

c# - 从属性中检索表达式并将其添加到表达式树

c# - C#获取IEnumerable <TModel>的类型

c# - Wpf ItemContainerGenerator.ContainerFromItem 返回 null

c# - Windows Media Player - 播放完毕后隐藏播放器

c# - 仅识别两个命令时如何使 MS speech API 更准确

c# - 如何获取弹出窗口的属性(id、CSS、xPath)

javascript - 在 Jasmine 中对多个相关文件使用描述 block

c# - 如何使用流利断言比较列表?

.net - 使用 Linq-2-Sql 时的 System.Transactions 源警告

linq-to-sql - 使用 linq-to-sql 的 2 层(客户端-服务器)桌面应用程序的良好架构