2009-09-08 21 views
5

Tôi đã được nhìn vào sau và có thể thấy rằng có những lợi ích tuyệt vời để đạt được bằng cách sử dụng các truy vấn biên soạn ... http://blogs.msdn.com/ricom/archive/2008/01/14/performance-quiz-13-linq-to-sql-compiled-query-cost-solution.aspxĐơn vị kiểm tra, LINQ to SQL và làm việc xung quanh Data Context

Vấn đề của tôi là mà tôi muốn đơn vị kiểm tra các truy vấn của tôi, nhưng các truy vấn được biên dịch cần một cá thể cụ thể của một lớp xuất phát từ DataContext (đặc biệt khó khăn để giả lập) ... Vì vậy tôi đã đưa ra đoạn mã sau và tôi đã tự hỏi nếu có biết liệu tôi có còn nhận được lợi ích hiệu suất của các truy vấn được biên dịch hay không ...

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

Lưu ý trong một kịch bản thử nghiệm đơn vị, db của tôi sẽ không có kiểu Database, nghĩa là nó sẽ gọi phiên bản chưa được biên dịch, trong một kịch bản prod sẽ có kiểu Database và sẽ chạy phiên bản đã biên dịch.

Cheers Anthony

Cập nhật: Ok ngay cả khi tôi làm cấu trúc lại mã để phương pháp của tôi mà hiện đang trong Dal sử dụng một kho lưu trữ mà trả về một IQueryable các câu hỏi cơ bản vẫn còn tồn tại, phiên bản của kho sử dụng các truy vấn được biên dịch sẽ bao bọc một phiên bản chứa truy vấn thô, theo cách tương tự với những gì tôi đang thực hiện vào lúc này ... với mẫu có _GetQuery gọi _GetQueryUnCompiled để tôi vẫn nhận được lợi ích hiệu suất không ??

+0

Bạn đã bao giờ tìm hiểu xem điều này có hiệu quả không? Tôi đang nghĩ đến việc làm điều tương tự. –

Trả lời

1

Chỉ cần suy nghĩ, bạn có thể cấu trúc lại để sử dụng IEnumerable<> chỉ bằng cách phân lớp không? Bằng cách này, bạn có thể kiểm tra mã DB riêng biệt với các truy vấn của mình?

+0

Yeap- tại sao một bài kiểm tra đơn vị cần biết về DataContext. Tôi chắc chắn không. – RichardOD