PDA

View Full Version : فرق Enumerable و Iqueryable وTolIst() ,



rahimi.mohamad24
جمعه 17 خرداد 1392, 09:28 صبح
سلام
فرق IEnumerable و Iqueryable وTolIst() , AsEnumerable
چیست؟

forestasphalt
جمعه 17 خرداد 1392, 13:19 عصر
Iqueryable اینترفیس IEnumerableتوسعه داده بنابراین شما هرکاری رو که با IEnumerable میتونی انجام بدی با Iqueryable هم میتونی انجام بدی
توی IEnumerable فقط میتونی به سمت جلو حرکت کنی به همین خاطر برای موقعیتی هایی مناسب هست که collection یا کلکسیون ها در حافظه قرار داشته باشن
که مقصود شمردن اون ها باشه که استفاده رایج اون در foreach هست.
Iqueryable برای کار با دیتابیس مناسب تر هست مخصوصا زمانی که از کوئری های با تاخیر (deferred execution کوئری هایی که در همون لحظه اجرا نمیشن)استفاده میکنید
http://www.dotnettips.info/post/473/%D8%AA%D9%81%D8%A7%D9%88%D8%AA-%D8%A8%DB%8C%D9%86-iqueryable-%D9%88-ienumerable-%D8%AF%D8%B1-%D8%AD%DB%8C%D9%86-%DA%A9%D8%A7%D8%B1-%D8%A8%D8%A7-orms
همونطوری که در لینک بالا آقای نصیری توضیح دادن IEnumerable یک مجموعه است ولی Iqueryable فقط یک کوئری هست که باید بعدها مثلا با دستور tolist() اجرا بشه
AsEnumerable متد جنریکی که به ما اجازه میده cast مخصوص خودمون رو از IEnumerable داشته باشیم(در واقع یک مجموعه رو به یک مجموعه از نوع IEnumerable<tsource> تبدیل میکنه)
مثال رو از سایت زیر میتونی ببینی
http://www.dotnetperls.com/asenumerable
Tolist() یک مجموعه از نوع IEnumerable<tsource> به یک مجموعه از نوع list<t> تبدیل میکنه (منظور از t ،type میباشد)
http://www.dotnetperls.com/tolist
برای مطالعه بیشتر آموزش جامع linq علی اقدم رجوع شود

rahimi.mohamad24
جمعه 17 خرداد 1392, 19:15 عصر
میخوام توجه شما را به این لینک جلب کنم:
http://jonkruger.com/blog/2007/10/19/iqueryable-vs-ienumerable-in-linq-to-sql-queries/
علت تفاوت مورد 1 با 2و3 در چیست؟
چرا 1 با دو تای دیگه فرق می کنه؟
ممنون میشم نظرتون را بگویید

forestasphalt
جمعه 17 خرداد 1392, 23:33 عصر
تفاوت در اینجا هست که IEnumerable یک مجموعه است یعنی همون موقع هر کاری باهاش کردیم تموم شده دیگه قابلیت این رو ندارم بعدا بیام بازم یک سری تغییرات رو بهش بدیم


NorthwindDataContext dc = new NorthwindDataContext();
IEnumerable list = dc.Products
.Where(p => p.ProductName.StartsWith("A"));
list = list.Take(10);
Debug.WriteLine(list.Count());

درمثال یک همونطوری که میبینی ما مجموعه رو بستیم بدون اینکه take کرده باشیم
ولی در مثال 2


NorthwindDataContext dc = new NorthwindDataContext();
IEnumerable list2 = dc.Products
.Where(p => p.ProductName.StartsWith("A"))
.Take(10);
Debug.WriteLine(list2.Count());

همونطوری که میبینی ما عملیات take رو انجام دادم
در مثال 3 که Iqueryable هست ما میتونیم بعدا یک سری تغییرات رو در کوئری بدیدم و هر چند بار که خواستیم مقادیر اون کوئری رو تغییر بدیم(کافی امتحان کنید یک فیلد از کوئری که از نوعIqueryable هست رو تغییر بدید مجددا نتیجه چاپ کنید میبینید که این مقدار تغییر کرده در حالی این امر در مورد IEnumerable صادق نیست )


NorthwindDataContext dc = new NorthwindDataContext();
IQueryable list3 = dc.Products
.Where(p => p.ProductName.StartsWith("A"));
list3 = list3.Take(10);
Debug.WriteLine(list3.Count());

اجرای کوئری های با تاخیر ویژگی خیلی خوبیه که در موردش در سایت یا اینترنت جستجو کنی مطالب خوبی ازش پیدا میکنی