2009-09-08 14 views
5

czekałem na następujące i wydaje się, że istnieją ogromne korzyści, jakie można osiągnąć za pomocą skompilowane zapytania ... http://blogs.msdn.com/ricom/archive/2008/01/14/performance-quiz-13-linq-to-sql-compiled-query-cost-solution.aspxUnit Testing, LINQ to SQL i pracy całego kontekstu danych

Mój problem jest Chcę przetestować moje zapytania, ale skompilowane zapytania wymagają konkretnej instancji klasy wywodzącej się z DataContext (co jest szczególnie trudne do wyłudzenia) ... Tak więc wymyśliłem następujący kod i zastanawiałem się, czy jakikolwiek wie, czy nadal powinienem uzyskać korzyści związane z kompilacją zapytań ...

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

Uwaga w scenariuszu testu jednostkowego mój db nie będzie typu Baza danych, co oznacza, że ​​wywoła nieskompilowaną wersję, w scenariuszu prod będzie to typ Baza danych i uruchomi skompilowaną wersję.

Cheers Anthony

Aktualizacja: Ok, nawet jeśli robię byłaby kod tak, że moja metoda, która jest obecnie w DAL używa repozytorium która zwraca IQueryable pytanie bazowy nadal pozostają wersję repozytorium który używa skompilowanych zapytań owinąłby wersję, która zawiera surowe zapytanie, w sposób podobny do tego, co robię w tej chwili ... ze wzorem wywołania _GetQuery _GetQueryUnCompiled czy nadal dostaję korzyść z wydajności?

+0

Czy kiedykolwiek zastanawiałeś się, czy to działa? Myślę o zrobieniu tego samego. –

Odpowiedz

1

Po prostu myśl, czy można refaktoryzacji używać IEnumerable<> tylko przez nakładanie warstw? W ten sposób możesz przetestować kod DB niezależnie od swoich zapytań?

+0

Yeap - dlaczego test jednostkowy musi w ogóle wiedzieć o DataContext. Mój na pewno nie. – RichardOD