Apakah tujuan AsQueryable()
hanya agar Anda dapat menyebarkan IEnumerable
ke metode yang mungkin diharapkan IQueryable
, atau adakah alasan yang berguna untuk menyatakan IEnumerable
sebagai IQueryable
? Misalnya, apakah seharusnya untuk kasus seperti ini:
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();
}
Atau apakah itu benar-benar membuatnya melakukan sesuatu yang berbeda:
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();
Apakah IQueryable
versi metode ekstensi ini hanya membuat Expression yang akhirnya melakukan hal yang sama setelah dieksekusi? Pertanyaan utama saya adalah, apa kasus penggunaan nyata untuk digunakan AsQueryable
?
sumber
IQueryable<T>
berasal dariIEnumerable<T>
bisakah Anda menjelaskan apa yang Anda maksud dengan "IQuerizable berbasis non-enumerable"?IQueryable
yang lebih dari sekedar dibungkusIEnumerable
, dan yang sebenarnya memanfaatkan kemampuan tambahanIQueryable
.Kasus paling valid yang saya miliki untuk AsQueryable adalah pengujian unit. Katakanlah saya memiliki contoh yang dibuat-buat berikut
dan saya ingin menulis pengujian unit untuk memastikan pengontrol mengirimkan kembali hasil yang dikembalikan dari repositori. Ini akan terlihat seperti ini:
di mana sebenarnya, semua metode AsQueryable () memungkinkan saya untuk lakukan adalah memuaskan kompilator saat menyiapkan tiruan.
Saya akan tertarik di mana ini digunakan dalam kode aplikasi.
sumber
Seperti yang dicatat oleh sanjuro, tujuan dari AsQueryable () dijelaskan dalam Menggunakan AsQuerable With Linq To Objects Dan Linq To SQL . Secara khusus, artikel tersebut menyatakan,
sumber
Tujuan dari AsQueryable () sangat dijelaskan dalam artikel ini Menggunakan AsQuerable With Linq To Objects Dan Linq To SQL
Dari bagian Keterangan MSDN Querizable.AsQuerable Method:
Itulah tepatnya yang disebutkan dan digunakan dalam artikel di atas. Dalam contoh Anda, ini tergantung pada apa yang dikembalikan orderRepo.GetAll, IEnumerable atau IQuerable (Linq to Sql). Jika ia mengembalikan IQuerizable, metode Count () akan dieksekusi pada database jika tidak maka akan dijalankan dalam memori. Perhatikan baik-baik contoh di artikel referensi.
sumber
IQueryable
Dokumentasi kutipan antarmuka :Jadi bagi seseorang yang bermaksud membuat datastracture-nya dapat di-query dalam .NET, struktur data yang tidak diperlukan tersebut dapat dicacah atau memiliki enumerator yang valid .
IEnumerator
adalah antarmuka untuk iterasi dan pemrosesan aliran data .sumber
IQueryable
danIEnumerable
, tetapi saya tidak memahami kasus penggunaan untukAsQueryable
metode ekstensi. Saya sedikit tersandung pada kalimat itu, yang saya curigai mungkin memiliki jawaban yang saya cari (berdasarkan suara positif).AsQueryable()
?" Jika saya memulai dengan IEnumerable (sesuatu yang sudah mampu menyediakan kemampuan enumerasi), mengapa saya perlu mengonversiIQueryable
menggunakan metode ekstensiAsQueryable()
? Mungkin contoh kode kecil untuk menggambarkan di mana ini akan berguna? Sepertinya saya melewatkan sesuatu dalam penjelasan Anda. Terima kasih atas waktunya.linq to sql
,linq to xml
dan sebagainya .. jika Anda ingin menulislinq
sopir bahwa target Anda strucutres data (linq to your data
), sehingga pengguna dari api Anda akan memiliki kemungkinan untuk menjalankanlinq
query terhadap Anda struktur data, Anda harus memilihIQueryable
IQueryable
danIEnumerable
. Saya tahu perbedaannya, dan bukan itu yang saya minta. Saya bertanya mengapa seseorang ingin mengambil sesuatu yang mengimplementasikanIEnumerable
, dan mengubahnya menjadiIQueryable
menggunakanAsQueryable
metode ekstensi. Itukah yang Anda jawab? Aku masih tidak tahu ..