2013-12-14 17 views
7

Tôi đã cố gắng để làm cho bộ điều khiển theo phương pháp không đồng bộLàm một bộ điều khiển Web API trả về một danh sách IQueryable không đồng bộ

public IQueryable<Category> GetCategories() 
{ 
    return _context.Categories; 
} 

Tôi đã thêm những điều sau đây để làm cho nó không đồng bộ

public async Task<IQueryable<Category>> GetCategories() 
{ 
    return await _context.Categories; 
} 

Các loại System.Data.Entity.DbSet không phải là awaitable

Tôi không chắc chắn làm thế nào để có được bối cảnh db để trả về tất cả các thực thể trong khi vẫn duy trì IQueryable.

Làm cách nào để bạn thực hiện phương pháp trên không đồng bộ? Cảm ơn hoặc sự giúp đỡ.

+1

Tôi nghi ngờ bạn có thể làm điều đó, tuy nhiên chức năng không đồng bộ chỉ khả dụng trên EF6, bạn đang sử dụng EF6? –

Trả lời

6

Có vẻ như bạn đang triển khai điểm cuối OData. Nếu bạn làm điều đó ở cấp độ này (trả lại một DbSet trực tiếp từ bộ điều khiển của bạn), bản chất không đồng bộ hoàn toàn phụ thuộc vào WebAPI; tất cả những gì bạn đang làm là trả lại số IQueryable rằng nó có thể sử dụng đồng bộ hoặc không đồng bộ.

Bạn không thể làm gì để "tạo" không đồng bộ và không có lý do.

2

Đây là giải pháp tôi thấy:

public async Task<IEnumerable<Category>> Get(ODataQueryOptions<Category> options) 
{ 
    var myQueryable = (IQueryable<Category>)options.ApplyTo(context.Categories); 
    return await myQueryable.ToListAsync(); 
} 

Nó hoạt động async và áp dụng các bộ lọc.

+0

Không có lý do để làm điều này. IQueryable không phải là một yêu cầu cho cơ sở dữ liệu của bạn. Nếu bạn tạo một bộ điều khiển từ mẫu Asp.net, bạn sẽ nhận thấy rằng chúng không đặt một async vào cuộc gọi Get() vì lý do đó. – jsgoupil

+1

Điều tôi muốn là khi IQueryable được thực hiện, yêu cầu tới cơ sở dữ liệu được thực hiện không đồng bộ sao cho ít chuỗi hơn được sử dụng. Vì vậy, nó là cần thiết trong ý nghĩa đó. Nếu không có kỹ thuật ở trên, khi các chủ đề truy cập vào DB, thread sẽ vẫn còn sống nhàn rỗi cho đến khi DB trả về một phản ứng. –

0

Tôi gặp sự cố tương tự và vì lý do nào đó, tôi không thể sử dụng trực tiếp .ToListAsync(), VS cũng không cho phép tôi sử dụng không gian tên QueryableExtensions. Cuối cùng, tôi quyết định triển khai toàn bộ mã như:

var categories = await System.Data.Entity.QueryableExtensions.ToListAsync(context.Categories.Where(c => c.Name != "On Sale")); 
Các vấn đề liên quan