Jest celem AsQueryable()
tylko po to, abyś mógł przekazać IEnumerable
metody, które mogą się spodziewać IQueryable
, lub czy istnieje przydatny powód, aby reprezentować je IEnumerable
jakoIQueryable
? Na przykład, czy powinno tak być w takich przypadkach:
IEnumerable<Order> orders = orderRepo.GetAll();
// I don't want to create another method that works on IEnumerable,
// so I convert it here.
CountOrders(orders.AsQueryable());
public static int CountOrders(IQueryable<Order> ordersQuery)
{
return ordersQuery.Count();
}
A może faktycznie sprawia, że robi coś innego:
IEnumerable<Order> orders = orderRepo.GetAll();
IQueryable<Order> ordersQuery = orders.AsQueryable();
IEnumerable<Order> filteredOrders = orders.Where(o => o.CustomerId == 3);
IQueryable<Order> filteredOrdersQuery = ordersQuery.Where(o => o.CustomerId == 3);
// Are these executed in a different way?
int result1 = filteredOrders.Count();
int result2 = filteredOrdersQuery.Count();
Czy IQueryable
wersje tych metod rozszerzających po prostu tworzą wyrażenie, które w końcu robi to samo po wykonaniu? Moje główne pytanie brzmi: jaki jest prawdziwy przypadek użycia AsQueryable
?
źródło
IQueryable<T>
pochodzi on z,IEnumerable<T>
czy możesz wyjaśnić, co masz na myśli, mówiąc o „niezliczalnym IQueryable opartym na liczbach”?IQueryable
który jest czymś więcej niż tylko zapakowanym plikiemIEnumerable
i w rzeczywistości wykorzystuje dodatkowe możliwości plikuIQueryable
.Najbardziej trafnym przypadkiem, jaki mam dla AsQueryable, jest testowanie jednostkowe. Powiedzmy, że mam następujący, nieco wymyślony przykład
i chcę napisać test jednostkowy, aby upewnić się, że kontroler przekazuje wyniki zwrócone z repozytorium. Wyglądałoby to mniej więcej tak:
gdzie tak naprawdę cała metoda AsQueryable () pozwala mi zadowolić kompilator podczas konfigurowania makiety.
Byłbym jednak zainteresowany, gdzie jest to używane w kodzie aplikacji.
źródło
Jak zauważył sanjuro, cel AsQueryable () jest wyjaśniony w artykule Używanie AsQueryable z Linq do obiektów i Linq To SQL . W szczególności artykuł stwierdza:
źródło
Cel AsQueryable () jest szczegółowo wyjaśniony w tym artykule Używanie AsQueryable z Linq To Objects i Linq To SQL
Z sekcji Uwagi metody MSDN Queryable.AsQueryable:
To jest dokładnie to, co zostało wspomniane i użyte w powyższym artykule. W twoim przykładzie zależy to od tego, co zwraca orderRepo.GetAll, IEnumerable lub IQueryable (Linq to Sql). Jeśli zwróci IQueryable, metoda Count () zostanie wykonana na bazie danych, w przeciwnym razie zostanie wykonana w pamięci. Przyjrzyj się uważnie przykładowi w przywołanym artykule.
źródło
IQueryable
Dokumentacja dotycząca wyceny interfejsu :Tak więc dla kogoś, kto zamierza udostępnić swoją strukturę danych do zapytań w .NET, ta niepotrzebna struktura danych może zostać wyliczona lub mieć prawidłowy moduł wyliczający .
IEnumerator
jest interfejsem do iteracji i przetwarzania strumienia danych .źródło
IQueryable
iIEnumerable
, ale nie rozumiem przypadku użyciaAsQueryable
metody rozszerzenia. Trochę się denerwuję, jeśli chodzi o to zdanie, które, jak podejrzewam, może zawierać odpowiedź, której szukam (na podstawie upvotes).AsQueryable()
?” Jeśli zaczynam od IEnumerable (coś, co jest już w stanie zapewnić możliwość wyliczenia), dlaczego miałbym konwertować naIQueryable
użycie metody rozszerzeniaAsQueryable()
? Może mały przykład kodu, aby zilustrować, gdzie to się przydaje? Wydaje mi się, że czegoś mi brakuje w twoim wyjaśnieniu. Dziękuję za Twój czas.linq to sql
,linq to xml
i tak ... jeśli chcesz napisaćlinq
sterownik, który jest przeznaczony dla twoich struktur danych (linq to your data
), aby użytkownicy twojego API mieli możliwość uruchamianialinq
zapytań w twoich strukturach danych, musisz wybraćIQueryable
IQueryable
iIEnumerable
. Znam różnicę i nie o to proszę. Pytam, dlaczego ktoś chciałby wziąć coś, który implementujeIEnumerable
i przekształcić go w produktIQueryable
przy użyciuAsQueryable
metody rozszerzenie. Czy to właśnie odpowiadasz? Nadal nie mogę powiedzieć ...