2013-02-24 9 views
5

Chciałbym zastosować nową funkcję async await do importu procedur/funkcji importowanych w moim modelu encji, ale jak dotąd nie udało się z alfa EF6.EF6 alfa Async Oczekuje na procedurę zapisaną w obiekcie/funkcję?

Czy jest możliwe, aby w EF6 alpha2 (lub nocnej kompilacji z 20211) wywoływać jedną z nowych metod Asynchronizacji w funkcji Import funkcji jednostki (która wywołuje procedurę składowania SQL), która zwraca kolekcję złożonego typu? na przykład

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”, lub którykolwiek z nowych asynchronicznych zmodyfikowanych metod nie wydają się być dostępne dla powyższego podmiotu procedura przechowywana/Funkcja importu; dostępne są tylko standardowe metody "ToList" lub "AsNumerable" etc.

Poszedłem za tym (http://entityframework.codeplex.com/wikipage?title=Updating%20Applications%20to%20use%20EF6), aby upewnić się, że kod odwołuje się do nowych bibliotek DLL EF6, a nie EF5, jak również zaktualizował różne instrukcje użycia. Poza powyższym wszystko buduje się poprawnie. (.NET Framework 4.5)

Jedyny przypadek, w którym widzę metody asynchroniczne, polega na tym, że zamiast tylko importować procedury przechowywane z bazy danych, również importuję tabelę - wtedy odwołując się do tej tabeli przez kontekst encji jak wyżej (context.SomeTable), niektóre metody asynchroniczne pojawiają się w intellisense.

Naprawdę chciałbym rozpocząć korzystanie z nowej funkcji async-await w wielu przechowywanych procedurach przed zwróceniem danych jako JSON, ale nie udało się jej do tej pory.

Czy robię coś nie tak? Czy funkcja asynchroniczna nie jest możliwa w przypadku importu/funkcji funkcji Entity? Dzięki za radę.

+0

Jaki typ ma "context.customStoredProcedure (id)" statycznie? – usr

+0

System.Data.Entity.Core.Objects.ObjectResult blueFish

+0

Czy kiedykolwiek działało? Mam ten sam problem z Stored Proc, który musi być ASYNC. –

Odpowiedz

4

To nie jest najlepsze rozwiązanie. Dodałem metodę rozszerzenia, aby móc wywoływać oczekiwanie na moje zapisane procedury. W nowszych wydaniach EF6.1 + powinniśmy to oficjalnie zaimplementować. Do tego czasu metoda fikcyjnego rozszerzenia wykonuje to zadanie.

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

Jeśli odzwierciedlać wersji 6 EF widać, że ObjectResult<T> faktycznie realizuje IDbAsyncEnumerable<T>, IDbAsyncEnumerable. A metoda dla ToListAsync<T>(this IDbAsyncEnumerable<T> source) powinna być w stanie połączyć ją tak samo jak kwerendę LINQ.

Edytuj Gdy ObjectResult jest pusty, zwracana jest wartość null. Możesz dodać if (source == null) return new List<T>();, jeśli chcesz zwrócić pustą listę zamiast wartości null.

+4

Tarło nowy wątek z 'Task.Run' tylko po to, aby" czekać "metoda całkowicie pokonuje cel async/await. Uwolniłeś swój główny wątek, oczekując, ale dopiero po zrobieniu nowego wątku. Twój występ będzie gorszy, jeśli uwzględnisz obciążenie związane z pojawieniem się tego nowego wątku, a następnie powrócisz do podstawowego, gdy ten, który stworzyłeś, zostanie ukończony. – TugboatCaptain

0

To jest stara nitka, ale czułem, że powinienem się nią podzielić. Powinieneś użyć APM, a następnie zawinąć synchroniczne wywołania w zadaniu.

Przykład:

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

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

Następnie owinąć synchroniczne metodę w zadanie:

// wraps the method in a task and returns the task. 
public Task<MyResult> MySPAsync() 
{ 
    MySPDelegate caller = new MySPDelegate(MySP); 
    return Task.Factory.FromAsync(caller.BeginInvoke, caller.EndInvoke, null); 
} 

wywołać metodę asynchroniczny, gdy chcesz wykonać:

var MyResult = await MySPAsync(); 

Można użyć do trzech (3) parametrów w metodach. Najlepszą praktyką jest użycie więcej niż trzech parametrów; powinieneś zdać w klasie.

Powiązane problemy