2016-04-09 5 views
0

Я пытаюсь понять, почему первый блок ошибки кода, а второй блок не является единственным отличием в том, что первый использует Task, а второй - isnt , Посмотрел на различные источники, но не смог получить четкий ответ. Кто-нибудь знает, как исправить первый блок?Преобразование задачи <DbSet<T>> Задача <IEnumerable <T>>

называют ссылкам ниже, но не повезло до сих пор How to cast DbSet<T> to List<T>
Why DbSet<TEntity> doesn't implement EnumerableAsync

public Task<IEnumerable<Asset>> GetAll() 
    { 
     var assets = Task.Factory.StartNew(() => _context.Books); 
     return assets; 
     // tried toList<asset>() on "return assets" as well but didnt make any difference. 
    } 


    public IEnumerable<Asset> GetAlls() 
    { 
     var assets = _context.Books; 
     return assets; 
    } 
+0

Почему вы возвращаетесь _context.Books в задаче? Какой смысл? Кажется, ничего полезного ему не приносит. – Evk

+1

Вы можете просто нарисовать _context.Books (IEnumerable ) внутри StartNew, чтобы решить вашу непосредственную проблему, но вопрос в том, почему вы делаете это в первую очередь. – Evk

+0

@Evk Я просто ознакомлюсь с Задачей на данный момент. это просто пример. я отвечу. – Sike12

ответ

1

Чтобы исправить, просто сделать вашу задачу вернуть ожидаемый тип, то есть IEnumerable<Asset>:

public Task<IEnumerable<Asset>> GetAll() 
{ 
    var assets = Task.Factory.StartNew(() => (IEnumerable<Asset>) _context.Books); 
    return assets; 
    // tried toList<asset>() on "return assets" as well but didnt make any difference. 
} 


public IEnumerable<Asset> GetAlls() 
{ 
    var assets = _context.Books; 
    return assets; 
} 
+0

Большое спасибо. Любые предложения по улучшению этого кода будут приветствоваться, поскольку вы упомянули, что я не должен делать это в первую очередь. – Sike12

+1

Если вы хотите загрузить книги асинхронно, просто выполните _context.Books.ToListAsync() (где ToListAsync() является методом расширения из EF 6). – Evk

+2

Если вы знакомы с задачами, вам также нужно понять, что в вашем коде запускается задача, немедленно возвращает _context.Books (он НЕ делает никаких запросов или вообще ничего, просто возвращает _context.Books as is) и завершает работу. Таким образом, он не делает никакой полезной работы вообще. – Evk

1

Вы в основном просто нужно это:

public async Task<IEnumerable<Asset>> GetAllAsync() 
{ 
    return await _context.Books; 
} 

Books из _context будет IEnumerable<Asset>. Используя async/wait, вы в основном получаете асинхронную загрузку Books. Основное различие между указанным выше способом и следующим способом

public IEnumerable<Asset> GetAlls() 
{ 
    var assets = _context.Books; 
    return assets; 
} 

является то, что, когда вы будете просить, чтобы перебирать результат GetAlls или создать список на основе этого результата путем вызова метода ToList, Вы сделаете синхронный вызов (блокирующий вызов, текущее выполнение будет заблокировано до тех пор, пока вы не получите запрошенные вами результаты. В первом случае вы отпускаете поток, в котором вызывается GetAllAsync(), и когда результаты будут доступны, выполнение вашего кода будет продолжаться на другой поток или в потоке, который вызывается , при условии, что данные доступны в момент запроса)

+2

Как вы ожидаете: DbSet ? Это не так. – Evk

+0

Привет @ Кристос благодарит вас за ответ, но, как сказал Evk, DbSet не является ожидаемым, поэтому компилятор будет жаловаться. – Sike12

+0

hi @Evk у меня такая же ошибка компилятора. – Sike12

Смежные вопросы