আইকিউয়েরেবল এবং আইনিউমারেবলের মধ্যে পার্থক্য কী


150

আমি পার্থক্য হিসাবে বিভ্রান্ত। নেট থেকে মোটামুটি নতুন হওয়া, আমি জানি আমি IEnumerablesলিনক এক্সটেনশানগুলি ব্যবহার করে জিজ্ঞাসা করতে পারি । সুতরাং এটি কী IQueryableএবং এটি কীভাবে পৃথক হয়?


এছাড়াও দেখুন আইকুয়্যারেবল [টি] এবং আইউনামেবল [টি] এর মধ্যে পার্থক্য কী? যে এই প্রশ্নের সাথে ওভারল্যাপ।

উত্তর:


186

IEnumerable<T>এর একমাত্র ফরওয়ার্ড কার্সারের প্রতিনিধিত্ব করে T। .NET 3.5 এক্সটেনশন পদ্ধতি অন্তর্ভুক্ত যোগ LINQ standard query operatorsমত Whereএবং Firstকোন অপারেটার যে predicates বা গ্রহণ বেনামী ফাংশন প্রয়োজন সঙ্গে Func<T>

IQueryable<T>একই লিনকিউ স্ট্যান্ডার্ড ক্যোয়ারী অপারেটরগুলি প্রয়োগ করে, তবে Expression<Func<T>>পূর্বাভাস এবং বেনাম ফাংশনগুলির জন্য গ্রহণ করে। Expression<T>একটি সংকলিত অভিব্যক্তি গাছ, পদ্ধতির একটি ভাঙা সংস্করণ ("যদি আপনি চান তবে" অর্ধ-সংকলিত) যা ক্যোয়ারিয়েবল সরবরাহকারী দ্বারা বিশ্লেষণ করতে পারে এবং তদনুসারে ব্যবহার করা যেতে পারে।

উদাহরণ স্বরূপ:

IEnumerable<Person> people = GetEnumerablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();

IQueryable<Person> people = GetQueryablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();

প্রথম ব্লকে, x => x.Age > 18একটি বেনামি পদ্ধতি ( Func<Person, bool>), যা অন্য কোনও পদ্ধতির মতো কার্যকর করা যেতে পারে। Enumerable.Whereপ্রতিটি ব্যক্তির জন্য একবার পদ্ধতি চালানো, হবে yieldমান, যার জন্য পদ্ধতি ফিরে ing true

দ্বিতীয় ব্লকে, x => x.Age > 18একটি অভিব্যক্তি গাছ ( Expression<Func<Person, bool>>), যা "বয়স 'সম্পত্তি> 18" হিসাবে ভাবা যেতে পারে।

এটি LINQ-to-SQL এর মতো জিনিসগুলিকে অস্তিত্ব রাখতে দেয় কারণ তারা অভিব্যক্তি গাছকে বিশ্লেষণ করতে এবং এটিকে সমতুল্য এসকিউএলে রূপান্তর করতে পারে। এবং যেহেতু সরবরাহকারীর IQueryableগণনা না করা অবধি মৃত্যুদণ্ডের প্রয়োজন নেই (এটি প্রয়োগ করে IEnumerable<T>, সর্বোপরি), এটি অন্তর্নিহিত তথ্যগুলির বিরুদ্ধে পুরো ক্যোয়ারীটি কীভাবে কার্যকর করা যায় তার বিষয়ে আরও চৌকস পছন্দগুলি করতে একাধিক ক্যোয়ারী অপারেটরকে (উপরের উদাহরণে Whereএবং FirstOrDefault) একত্রিত করতে পারে উত্স ( SELECT TOP 1এসকিউএল ব্যবহার করার মতো )।

দেখা:


1
চমত্কার সংক্ষিপ্ত উত্তর
আশাভেলি

83

বাস্তব জীবনে আপনি যদি লিংক-টু-এসকিউএল এর মতো কোনও ORM ব্যবহার করে থাকেন

  • যদি আপনি একটি তৈরি করেন IQueryable, তবে ক্যোয়ারীটি এসকিউএলে রূপান্তরিত হতে পারে এবং ডাটাবেস সার্ভারে চলে
  • যদি আপনি একটি তৈরি করেন IEnumerable, তবে ক্যোরি চালানোর আগে সমস্ত সারিগুলি বস্তু হিসাবে মেমরিতে টানা হবে।

উভয় ক্ষেত্রেই যদি আপনি কোনও কল না করেন ToList()বা ToArray()ততক্ষণে এটি ব্যবহারের সময় ক্যোয়ারি কার্যকর করা হবে, সুতরাং, বলুন, আপনার কাছে একটি রয়েছে IQueryableএবং আপনি এটি থেকে 4 টি তালিকা বাক্স পূরণ করেন, তাহলে ক্যোয়ারীটি 4 বার ডাটাবেসের বিরুদ্ধে চালানো হবে।

এছাড়াও আপনি যদি আপনার জিজ্ঞাসা প্রসারিত করেন:

q.Select(x.name = "a").ToList()

তারপরে একটি IQueryableউত্পন্ন এসকিউএল সহ থাকবে where name = "a", তবে আরও IEnumerableঅনেক ভূমিকা নিয়ে ডাটাবেস থেকে ফিরে আসা x.name = "a"হবে , তারপরে চেকটি নেট থেকে সম্পন্ন হবে।


"কোয়েরিটি এসকিউএলে রূপান্তরিত হতে পারে": আমি 'হতে পারে' পাইনি। এছাড়াও, যদি আমার আইইনুমেয়রিয়াল থাকে এবং আইকুয়েরেবলের বিপরীতে 'স্পষ্টতই' জটিল চেইন তৈরি করি তবে এটি কোনও 'অনুকূলিত' এসকিউএল কোয়েরিতে অনুবাদ হবে না। আপনি যখন বলবেন 'সমস্ত সারি স্মৃতিতে টানা হবে' তখন এর অর্থ কী তা নিশ্চিত করতে চাই Just আসুন আমরা বলি যে আমার দুটি যেখানে ধারা রয়েছে, তারপরে সত্ত্বার সমস্ত টুপলগুলি প্রথমে স্মৃতিতে আনা হবে এবং তারপরে স্বাভাবিক 'ইন-মেমরি' ফিল্টারিং ঘটবে?
বৈভব

36

"প্রাথমিক পার্থক্য হ'ল আইকুয়েরেবলের জন্য সংজ্ঞায়িত এক্সটেনশন পদ্ধতিগুলি ফানক অবজেক্টগুলির পরিবর্তে এক্সপ্রেশন অবজেক্ট গ্রহণ করে, অর্থাত্ ডেলিগেট এটি গ্রহণ করার পদ্ধতির পরিবর্তে একটি এক্সপ্রেশন ট্রি IE ইন মেমোরি সংগ্রহের সাথে কাজ করার জন্য আইনামেরেবল দুর্দান্ত, তবে আইকুয়েরেবল অনুমতি দেয় একটি দূরবর্তী ডেটা উত্সের জন্য, যেমন একটি ডাটাবেস বা ওয়েব পরিষেবা "

সূত্র: এখানে


19

আইনিম্যারেবল আইমনামেবল ইন-মেমরি কালেকশনের সাথে কাজ করার জন্য সবচেয়ে উপযুক্ত। আইনিম্যারেবল আইটেমগুলির মধ্যে স্থানান্তরিত করে না, এটি কেবল সংগ্রহের জন্য এগিয়ে।

ডেটাবেস বা ওয়েব পরিষেবাদির মতো রিমোট ডেটা উত্সের জন্য আইকোয়্যারেবল আইকিরিবেল সেরা স্যুট। আইকিউয়েরেবল হ'ল একটি শক্তিশালী বৈশিষ্ট্য যা বিভিন্ন ধরণের মুলতুবি বাস্তবায়নের পরিস্থিতি সক্ষম করে (যেমন পেজিং এবং রচনার উপর ভিত্তি করে অনুসন্ধানগুলি)।

সুতরাং যখন আপনাকে কেবল ইন-মেমরি সংগ্রহের মাধ্যমে পুনরাবৃত্তি করতে হবে তখন আইইনুমারেবল ব্যবহার করুন, যদি আপনাকে ডেটাসেট এবং অন্যান্য ডেটা উত্সগুলির মতো সংগ্রহের সাথে কোনও হেরফের করতে হয়, তবে আইকুয়েরেবল ব্যবহার করুন


11

মূল নীতিগত পার্থক্য হ'ল আইনামিউরেবল তার সমস্ত উপাদানকে সর্বদা গণনা করবে, যখন আইকিউয়েরেবল একটি কোয়েরির উপর ভিত্তি করে উপাদানগুলি গণনা করবে বা এমনকি অন্যান্য জিনিসও করবে। ক্যোয়ারীটি একটি এক্সপ্রেশন (। নেট কোডের একটি উপাত্ত উপস্থাপনা), যা কোনও আইকিউরিপ্রোভাইডার অবশ্যই ফলাফল উত্পন্ন করতে অবশ্যই অন্বেষণ / ব্যাখ্যা / সংকলন / যা কিছু করতে পারে।

ক্যোয়ারী এক্সপ্রেশন থাকা দুটি সুবিধা দেয়।

প্রথম সুবিধাটি হ'ল অপটিমাইজেশন। 'কোথাও' এর মতো সংশোধকরা কোয়েরি এক্সপ্রেশনটিতে অন্তর্ভুক্ত হওয়ায় আইকুয়েরিপ্রোভাইডার অন্যথায় অসম্ভব অসম্পূর্ণতা প্রয়োগ করতে পারে। সমস্ত 'উপাদান' ফিরিয়ে দেওয়ার পরিবর্তে তাদের বেশিরভাগকে 'যেখানে' শর্তের কারণে ফেলে দেওয়ার পরিবর্তে সরবরাহকারী একটি প্রদত্ত কী দিয়ে আইটেমগুলি সনাক্ত করতে হ্যাশ টেবিল ব্যবহার করতে পারে।

দ্বিতীয় সুবিধা হ'ল নমনীয়তা। এক্সপ্রেশনগুলি এক্সপ্লোরেশনযোগ্য ডেটা স্ট্রাকচার হওয়ায় আপনি ক্যোরিটিকে সিরিয়ালাইজ করতে এবং এটি একটি দূরবর্তী মেশিনে প্রেরণ করার মতো কাজ করতে পারেন (উদাঃ লিনক-টু-এসকিএল)।


1

আইকিউরিয়েবল আইইনুমারেবলের মতো একই তবে এটি লিনকের সাথে কাস্টম অনুসন্ধান কার্যকর করার জন্য অতিরিক্ত কার্যকারিতা সরবরাহ করে। এমএসডিএন সম্পর্কে এখানে বিবরণ দেওয়া হয়েছে: http://msdn.microsoft.com/en-us/library/system.linq.iqueryable.aspx


1

প্রথমত আইনিম্যারেবলটি একটি সিস্টেমের মধ্যে পাওয়া যায় Col সংগ্রহের নেমস্পেসে এবং আইকোয়ারি থেকে পাওয়া যায় এমন একটি সিস্টেম Lলিনক নেমস্পেসে। তালিকা, অ্যারে সংগ্রহ ইত্যাদির মতো ইন-মেমোরি সংগ্রহ থেকে ডেটা জিজ্ঞাসা করার সময় এবং আপনি যখন আইকুয়েরেবল ব্যবহার করছেন তখন আউট-মেমরির (যেমন রিমোট ডাটাবেস, পরিষেবা) সংগ্রহ থেকে ডেটা জিজ্ঞাসা করার সময় আপনি যদি আইনিউমেবল ব্যবহার করেন। ডাটাবেস থেকে ডেটা জিজ্ঞাসা করার সময়, IEnumerable সার্ভার সাইডে নির্বাচিত ক্যোয়ারী চালায়, ক্লায়েন্ট সাইডে মেমরি ইন-মেমরি লোড করুন এবং তারপরে ডেটা ফিল্টার করুন। সুতরাং আরও কাজ করে এবং ধীর হয়ে যায়। ডাটাবেস থেকে ডেটা জিজ্ঞাসা করার সময়, আইকিউয়েরেবল সমস্ত ফিল্টার সহ সার্ভারের পাশে নির্বাচন করা কোয়েরি সম্পাদন করে। সুতরাং কম কাজ করে এবং দ্রুত হয়ে ওঠে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.