এর আগে অনেক কিছু বলা হয়েছিল, তবে আরও প্রযুক্তিগত উপায়ে শিকড়গুলিতে ফিরে:
IEnumerable
মেমরির অবজেক্টগুলির একটি সংকলন যা আপনি গণনা করতে পারেন - একটি মেমরির ক্রম যা এর মাধ্যমে পুনরাবৃত্তি করা সম্ভব করে তোলে ( foreach
লুপের মধ্যে এটি সহজতর করে তোলে যদিও আপনি IEnumerator
কেবল সাথে যেতে পারেন )। তারা যেমন স্মৃতিতে থাকে।
IQueryable
চূড়ান্ত ফলাফলটি গণনা করার ক্ষমতা সহ এমন একটি অভিব্যক্তি গাছ যা কোনও সময়ে অন্য কোনও কিছুতে অনুবাদ হয়ে যায় । আমার ধারণা এটি বেশিরভাগ লোককেই বিভ্রান্ত করে।
তাদের স্পষ্টতই ভিন্ন ধারণা রয়েছে।
IQueryable
একটি এক্সপ্রেশন ট্রি (একটি ক্যোয়ারী, সহজভাবে) উপস্থাপন করে যা অন্তর্নিহিত ক্যোয়ার সরবরাহকারীর দ্বারা অন্য কোনও কিছুতে অনুবাদ করা হবে যেমন মুক্তির API গুলি বলা হবে, যেমন LINQ সমষ্টিগত ফাংশন (যোগফল, গণনা ইত্যাদি) বা টোললিস্ট [অ্যারে, অভিধান ,. ..]। এবং IQueryable
অবজেক্টগুলি প্রয়োগ করে IEnumerable
, IEnumerable<T>
যাতে তারা কোনও প্রশ্নের প্রতিনিধিত্ব করে তবে সেই ক্যোয়ারির ফলাফলটি পুনরাবৃত্তি হতে পারে। এর অর্থ হল আইকুয়েরেবলের জন্য কেবল অনুসন্ধান করা উচিত নয়। সঠিক শব্দটি হ'ল তারা হ'ল অভিব্যক্তি গাছ ।
এখন এই এক্সপ্রেশনগুলি কীভাবে কার্যকর করা হয় এবং তারা কী পরিবর্তন করে তা সমস্ত তথাকথিত ক্যোয়ারী সরবরাহকারী (এক্সপ্রেশন এক্সিকিউটররা আমরা তাদের ভাবতে পারি)।
ইন সত্তা ফ্রেমওয়ার্ক বিশ্বের (যা যে রহস্যময় অন্তর্নিহিত তথ্য উৎস প্রোভাইডার, বা কোয়েরি প্রদানকারী) IQueryable
এক্সপ্রেশন নেটিভ অনুবাদ করা হয় টি-এসকিউএল প্রশ্নের। Nhibernate
তাদের সাথে একই জিনিস করে। লিনকিউ-তে বর্ণিত ধারণাগুলি অনুসরণ করে আপনি নিজের নিজস্বটি লিখতে পারেন : উদাহরণস্বরূপ, আইকোয়ারিযোগ্য সরবরাহকারী লিঙ্ক তৈরি করা এবং আপনি আপনার পণ্য সরবরাহকারীর পরিষেবাটির জন্য একটি কাস্টম অনুসন্ধানের API পেতে চাইতে পারেন।
সুতরাং মূলত, IQueryable
অবজেক্টগুলি পুরোপুরি দীর্ঘ অবধি নির্মিত হচ্ছে যতক্ষণ না আমরা স্পষ্টভাবে তাদের প্রকাশ করি এবং সিস্টেমকে এসকিউএল বা যে কোনও ক্ষেত্রে পুনরায় লেখার জন্য এবং প্রবাহের প্রক্রিয়াটির জন্য নির্বাহের শৃঙ্খলা প্রেরণ করতে না পারি।
যদি হিসাবে বিলম্বিত সঞ্চালনের এটি একটি এর LINQ
বৈশিষ্ট্য মেমরি অভিব্যক্তি গাছ প্রকল্প তুলে ধরুন এবং শুধুমাত্র চাহিদা, যখনই নির্দিষ্ট API গুলি ক্রম (একই কাউন্ট, ToList, ইত্যাদি) বিরুদ্ধে বলা হয় উপর সঞ্চালনের সেটিকে পাঠান।
উভয়ের যথাযথ ব্যবহার আপনি নির্দিষ্ট ক্ষেত্রে যে কাজগুলি করছেন তার উপর নির্ভর করে। সুপরিচিত সংগ্রহস্থল প্যাটার্নের জন্য আমি ব্যক্তিগতভাবে ফিরে আসার জন্য বেছে নিই IList
, এটি IEnumerable
তালিকাগুলির উপরে (সূচকগুলি এবং অন্যান্য)। সুতরাং IQueryable
কোডের অন্য কোথাও কেবল সংগ্রহস্থলগুলির মধ্যেই এবং IENumerable ব্যবহার করার জন্য আমার পরামর্শ my টেস্টিবিলিটি উদ্বেগগুলি যা IQueryable
ভেঙে যায় এবং উদ্বেগের নীতির বিচ্ছেদকে নষ্ট করে দেয় সে সম্পর্কে বলছি না । আপনি যদি সংগ্রহস্থলগুলির মধ্যে থেকে কোনও অভিব্যক্তি ফিরে পান তবে গ্রাহকরা তাদের ইচ্ছা অনুযায়ী অধ্যবসায় স্তরটি খেলতে পারেন।
জগাখিচির সাথে সামান্য সংযোজন :) (মন্তব্যগুলিতে আলোচনার মাধ্যমে)) সেগুলির কোনওটিই মেমরির বস্তু নয় যেহেতু সেগুলি প্রতি আসল ধরণের নয়, তারা একটি প্রকারের চিহ্নিতকারী - আপনি যদি আরও গভীরভাবে যেতে চান তবে। আইকনামেবলগুলিকে ইন-মেমরি সংগ্রহ হিসাবে ভাবনা এবং আইকুয়েরেবলকে এক্সপ্রেশন ট্রি হিসাবে মনে করার জন্য এটি (এবং এমনকি এমএসডিএন এটিকে এভাবে রেখেছিল) তা উপলব্ধি করে sense মুল বক্তব্যটি হল আইকুয়েরেবল ইন্টারফেস আইইনুমারেবল ইন্টারফেসকে উত্তরাধিকার সূত্রে উত্তম করে তোলে যাতে এটি যদি কোনও প্রশ্নের প্রতিনিধিত্ব করে তবে সেই ক্যোয়ারির ফলাফলগুলি গণনা করা যায়। গণনা একটি আইকিউয়েরেবল অবজেক্টের সাথে যুক্ত অভিব্যক্তি গাছের মৃত্যুর জন্য কার্যকর করে। সুতরাং, প্রকৃতপক্ষে, আপনি মেমরিটিতে অবজেক্ট না রেখে কোনও প্রকৃত সদস্যকে সত্যই কল করতে পারবেন না। এটি যদি খালি না হয় তবে তা সেখানে প্রবেশ করবে। আইকিউয়েবিয়েবলগুলি কেবল কোয়েরি হয়, ডেটা নয়।