簡體   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