EF6 alpha Async Ожидание при сохранении объекта / функции импорта?

async-await c#-5.0 entity-framework entity-framework-6

Вопрос

Я хотел бы применить новую функцию ожидания async для хранения хранимых процедур / импортов функций, импортированных в моей модели Entity, но до сих пор не смог с альфа EF6.

Возможно ли еще в EF6 alpha2 (или ночной сборке с 20211) вызвать любой из новых методов Async в Entity Function Import (который вызывает SQL хранимую процедуру), который возвращает коллекцию сложного типа? например

private async Task<IList<Company>> getInfo (string id)
{
    using (CustomEntity context = new CustomEntity())
    {
        var query = await context.customStoredProcedure(id).ToListAsync();
        // ".ToListAsync()" method not available on above line

        // OR ALTERNATIVELY
        var query = await (from c in context.customStoredProcedure(id)
                           select new Company
                           {
                              Ident = c.id,
                              Name = c.name,
                              Country = c.country,
                              Sector = c.sector, 
                              etc. etc....
                           }).ToListAsync();
        // ".ToListAsync()" method or any "...Async" methods also not available this way

        return query;
    }
}

«ToListAsync» или любой из новых модифицированных асинхронных методов, похоже, не доступны для вышеупомянутого Хранилища объектов / Импорт функций; доступны только стандартные методы «ToList» или «AsNumerable» и т. д.

Я последовал этому ( http://entityframework.codeplex.com/wikipage?title=Updating%20Applications%20to%20use%20EF6 ), чтобы убедиться, что код ссылается на новые DLL-файлы EF6, а не EF5, а также обновил различные заявления. Помимо вышеизложенного, все строит правильно. (.NET Framework 4.5)

Единственный раз, когда я могу видеть методы async, заключается в том, что вместо того, чтобы импортировать хранимые процедуры из БД, я также импортирую таблицу, а затем, ссылаясь на эту таблицу через контекст Entity, как указано выше (context.SomeTable), некоторые из методов async появляются в intellisense.

Я бы очень хотел начать использовать новую функцию ожидания async во многих хранимых процедурах до возвращения данных как JSON, но пока не смог заставить ее работать.

Я делаю что-то неправильно? Является ли асинхронная функциональность невозможной для импорта хранимых процедур / функций Entity? Спасибо за ваш совет.

Принятый ответ

Теперь это далеко не лучшее решение. Я добавил метод расширения, чтобы я мог позвонить в мои хранимые процедуры. В новых версиях EF6.1 + мы должны увидеть, что это официально реализовано. До тех пор этот фиктивный метод расширения выполняет эту работу.

static async Task<List<T>> ToListAsync<T>(this ObjectResult<T> source)
{
    var list = new List<T>();
    await Task.Run(() => list.AddRange(source.ToList()));
    return list;
}

Если вы отражаете версию 6 EF, вы увидите, что ObjectResult<T> фактически реализует IDbAsyncEnumerable<T>, IDbAsyncEnumerable . И метод ToListAsync<T>(this IDbAsyncEnumerable<T> source) должен иметь возможность ToListAsync<T>(this IDbAsyncEnumerable<T> source) его так же, как запрос LINQ.

Редактировать Когда объект ObjectResult пуст, возвращается null. Вы можете добавить if (source == null) return new List<T>(); если вы хотите вернуть пустой список вместо null.


Популярные ответы

Это старая нить, но я чувствовал, что должен поделиться. Вы должны использовать APM, а затем обернуть синхронные вызовы в Задаче.

Пример:

//declare the delegate
private delegate MyResult MySPDelegate();

// declare the synchronous method
private MyResult MySP()
{
    // do work...
}

Затем заверните синхронный метод в Задаче:

//declare the delegate
private delegate MyResult MySPDelegate();

// declare the synchronous method
private MyResult MySP()
{
    // do work...
}

Вызовите метод async, когда вы хотите выполнить:

//declare the delegate
private delegate MyResult MySPDelegate();

// declare the synchronous method
private MyResult MySP()
{
    // do work...
}

В методах можно использовать до трех (3) параметров. Лучшей практикой является использование более трех параметров; вы должны пройти в классе.




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему