2009-09-08 13 views
5

etrafında çalışan http://blogs.msdn.com/ricom/archive/2008/01/14/performance-quiz-13-linq-to-sql-compiled-query-cost-solution.aspxBirim Testi, Linq to SQL ve ben bakarak edilmiştir Veri Bağlamında

Benim sorundur ... Aşağıdaki ve derlenmiş sorguları kullanarak elde edilecek büyük faydalar olduğunu görünür Ben birim sorgularımı test etmek istiyorum, ancak derlenmiş sorgular DataContext (özellikle alay etmek zor olan) bir sınıfın somut bir örneğini gerekir ... Bu yüzden ben aşağıdaki kodu ile geldim ve merak ediyorum derlenmiş sorguların performans avantajlarını hala almam gerekip gerekmediğini bilir ...

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); 
} 

Bir birim sınama senaryosunda notum db veritabanı tipinde olmayacak, bu da derlenmemiş sürümü çağıracağı anlamına gelir, bir prod senaryosunda bu tür bir Veritabanında olacak ve derlenmiş sürümü çalıştıracaktır.

Alkış Anthony

Güncelleme: Ben DAL şu anda benim yöntem yatan soru hala bulunduğu bir IQueryable, depo sürümünü döndüren bir depo kullanır, böylece kod refactor yapmak bile Tamam derlenmiş sorgular kullanan bir sorgu, ham sorgu içeren bir sürümü, şu anda ne yapıyorum benzer bir şekilde sarmak olurdu ... _GetQuery çağrısı _GetQueryUnCompiled sahip olma modeli ile hala bir performans yararı olsun?

+0

Bunun işe yarayıp yaramadığını anladınız mı? Ben de aynı şeyi yapmayı düşünüyorum. –

cevap

1

Sadece bir düşüncede, IEnumerable<>'u yalnızca katmanlama ile kullanmak için refactor yapabilir misiniz? Bu şekilde DB kodunu sorgularınızdan ayrı olarak test edebilirsiniz?

+0

Yeap- neden bir birim testinin DataContext hakkında bilinmesi gerekiyor. Benimki kesinlikle değil. – RichardOD