মধ্যে পার্থক্য কি IQueryable<T>
এবং IEnumerable<T>
?
এই প্রশ্নের সাথে ওভারল্যাপ করে আইকিউয়ারিযোগ্য এবং আইনিউমারেবলের মধ্যে পার্থক্য কী তাও দেখুন ।
মধ্যে পার্থক্য কি IQueryable<T>
এবং IEnumerable<T>
?
এই প্রশ্নের সাথে ওভারল্যাপ করে আইকিউয়ারিযোগ্য এবং আইনিউমারেবলের মধ্যে পার্থক্য কী তাও দেখুন ।
উত্তর:
প্রথমত, ইন্টারফেসটি প্রসারিত করে , তাই আপনি "প্লেইন" দিয়ে যা কিছু করতে পারেন , আপনি এটি দিয়েও করতে পারেন ।IQueryable<T>
IEnumerable<T>
IEnumerable<T>
IQueryable<T>
IEnumerable<T>
কেবলমাত্র এমন একটি GetEnumerator()
পদ্ধতি রয়েছে Enumerator<T>
যা এর জন্য ফিরে আসে যার জন্য আপনি টি এরMoveNext()
ক্রমিকের মাধ্যমে পুনরাবৃত্তি করতে তার পদ্ধতিটি কল করতে পারেন ।
কি IQueryable<T>
যে হয়েছে IEnumerable<T>
না বিশেষ এক দুই সম্পত্তি করে একটি পয়েন্ট ক্যোয়ারী প্রদানকারী (যেমন, এসকিউএল প্রদানকারী করার জন্য একটি LINQ) এবং একটি থেকে অন্য একটি ইশারা ক্যোয়ারী অভিব্যক্তি প্রতিনিধিত্বমূলক IQueryable<T>
একটি রানটাইম-traversable বিমূর্ত সিনট্যাক্স গাছ যে হতে পারে যেমন বস্তুর প্রদত্ত ক্যোয়ারী সরবরাহকারীর দ্বারা বোঝা গেছে (বেশিরভাগ অংশে, আপনি ব্যতিক্রম ছাড়াই সত্তা সরবরাহকারীগুলিকে একটি লিনকিউতে একটি এসকিউএল এক্সপ্রেশনকে একটি লিনকিউ দিতে পারবেন না)।
অভিব্যক্তিটি কেবল অবজেক্টের নিজেই ধ্রুবক অভিব্যক্তি বা ক্যোয়ারী অপারেটর এবং অপারেশনগুলির সমন্বিত সেটগুলির আরও জটিল গাছ হতে পারে। ক্যোয়ারীর সরবরাহকারীর IQueryProvider.Execute()
বা IQueryProvider.CreateQuery()
পদ্ধতিগুলিকে এতে একটি এক্সপ্রেশন দিয়ে বলা হয় এবং তারপরে হয় কোয়েরির ফলাফল বা অন্য IQueryable
কোনওটি যথাক্রমে ফিরে আসে।
AsQueryable()
কেবলমাত্র একটি প্রশ্নযোগ্য হিসাবে একটি গণনাযোগ্য ছাঁটাই করবে এবং যদি এটি IQueryable
ইন্টারফেস প্রয়োগ করে তবে তা ফিরিয়ে দেবে , অন্যথায় এটি এটি একটিতে আবৃত করে ConstantExpression
, যা প্রত্যাবর্তিত EnumerableQuery
অবজেক্টে উল্লেখ করা হয় ।
প্রাথমিক পার্থক্য হ'ল লিনকিউ অপারেটররা প্রতিনিধিদের পরিবর্তে বস্তু IQueryable<T>
গ্রহণ Expression
করে, যার অর্থ কাস্টম ক্যোয়ারী যুক্তি যেমন এটি গ্রহণ করে, উদাহরণস্বরূপ, একটি প্রাকটিক বা মান নির্বাচক, কোনও পদ্ধতির প্রতিনিধি পরিবর্তে এক্সপ্রেশন ট্রি আকারে।
IEnumerable<T>
মেমোরিতে পুনরাবৃত্তি হওয়া সিকোয়েন্সগুলির সাথে কাজ করার জন্য দুর্দান্ত but IQueryable<T>
দূরবর্তী ডেটা উত্স যেমন কোনও ডাটাবেস বা ওয়েব পরিষেবাদির মতো স্মৃতি ছাড়িয়ে যাওয়ার অনুমতি দেয়।যেখানে একটি ক্যোয়ারির সম্পাদনা "প্রক্রিয়াধীন" সম্পাদিত হতে চলেছে , সাধারণত কোয়েরির প্রতিটি অংশ কার্যকর করতে কোড (কোড হিসাবে) এর জন্য প্রয়োজনীয় সমস্ত প্রয়োজন।
প্রক্রিয়াজাতকরণটি প্রক্রিয়াজাতকরণের বাইরে সঞ্চালিত হবে যেখানে কোয়েরির যুক্তি তথ্য উপাত্তে উপস্থাপন করতে হবে যাতে লিনকুই সরবরাহকারী এটিকে মেমরির বহির্মুখী মৃত্যুর জন্য উপযুক্ত আকারে রূপান্তর করতে পারে - এটি এলডিএপি কোয়েরি কিনা, এসকিউএল বা যাই হোক না কেন।
আরো:
এটি ইউটিউবে একটি দুর্দান্ত ভিডিও যা দেখায় যে এই ইন্টারফেসগুলি কীভাবে আলাদা worth
নীচে এটির জন্য একটি দীর্ঘ বর্ণনামূলক উত্তর দেওয়া আছে।
মনে রাখা প্রথম গুরুত্বপূর্ণ বিষয় হ'ল IQueryable
ইন্টারফেস উত্তরাধিকার সূত্রে প্রাপ্ত IEnumerable
, তাই যা কিছু IEnumerable
করতে পারে তা করতে IQueryable
পারে।
অনেক পার্থক্য রয়েছে তবে আসুন আমরা একটি বড় পার্থক্য সম্পর্কে আলোচনা করি যা সবচেয়ে বড় পার্থক্য তৈরি করে। IEnumerable
ইন্টারফেসটি কার্যকর যখন আপনার সংগ্রহটি লোকে লোড করা হয় LINQ
বা সত্তা ফ্রেমওয়ার্ক এবং আপনি সংগ্রহে ফিল্টার প্রয়োগ করতে চান।
নীচের সরল কোড যা IEnumerable
সত্তা ফ্রেমওয়ার্ক সহ ব্যবহার করে তা বিবেচনা করুন । কার Where
রেকর্ড পেতে এটি একটি ফিল্টার ব্যবহার EmpId
করছে 2
।
EmpEntities ent = new EmpEntities();
IEnumerable<Employee> emp = ent.Employees;
IEnumerable<Employee> temp = emp.Where(x => x.Empid == 2).ToList<Employee>();
IEnumerable
কোড যেখানে ক্লায়েন্টের পাশেই ফিল্টার কার্যকর করা হয়। অন্য কথায় সমস্ত ডেটা তার স্ক্যান ক্লায়েন্ট এ ডাটাবেস থেকে সংগৃহীত হয় এবং তারপর সঙ্গে রেকর্ড পায় EmpId
হয় 2
।
কিন্তু এখন নিচের কোড আমরা পরিবর্তিত হয়েছে তা দেখতে IEnumerable
করতে IQueryable
। এটি সার্ভারের পাশে একটি এসকিউএল ক্যোয়ারী তৈরি করে এবং ক্লায়েন্টের পক্ষে কেবল প্রয়োজনীয় ডেটা প্রেরণ করা হয়।
EmpEntities ent = new EmpEntities();
IQueryable<Employee> emp = ent.Employees;
IQueryable<Employee> temp = emp.Where(x => x.Empid == 2).ToList<Employee>();
সুতরাং এর মধ্যে পার্থক্য IQueryable
এবং IEnumerable
যেখানে ফিল্টার যুক্তিবিজ্ঞান কার্যকর সম্পর্কে। একটি ক্লায়েন্টের পক্ষে কার্যকর করা হয় এবং অন্যটি ডাটাবেসে কার্যকর করে।
সুতরাং আপনি যদি কেবল ইন-মেমোরি ডেটা সংগ্রহের সাথে কাজ করে থাকেন IEnumerable
তবে এটি একটি ভাল পছন্দ তবে আপনি যদি ডেটাবেসের সাথে সংযুক্ত ডেটা সংগ্রহের প্রশ্নটি করতে চান `আইকিউয়েরেবল আরও ভাল পছন্দ কারণ এটি নেটওয়ার্ক ট্র্যাফিক হ্রাস করে এবং এসকিউএল ভাষার শক্তি ব্যবহার করে।
আইমনামেবল: মেমোরি কালেকশন (বা স্থানীয় কোয়েরি) এর সাথে কাজ করার জন্য IEnumerable সবচেয়ে উপযুক্ত। আইনিম্যারেবল আইটেমগুলির মধ্যে স্থানান্তরিত করে না, এটি কেবল সংগ্রহের জন্য এগিয়ে।
আইকিউয়েরেবল: ডেটাবেস বা ওয়েব পরিষেবা (বা রিমোট কোয়েরি) এর মতো রিমোট ডেটা উত্সের জন্য আইকুয়েরেবল সেরা স্যুট। আইকিউয়েরেবল হ'ল একটি শক্তিশালী বৈশিষ্ট্য যা বিভিন্ন ধরণের মুলতুবি বাস্তবায়নের পরিস্থিতি সক্ষম করে (যেমন পেজিং এবং রচনার উপর ভিত্তি করে অনুসন্ধানগুলি)।
সুতরাং যখন আপনাকে কেবল ইন-মেমরি সংগ্রহের মাধ্যমে পুনরাবৃত্তি করতে হবে তখন আইইনুমারেবল ব্যবহার করুন, যদি আপনাকে ডেটাসেট এবং অন্যান্য ডেটা উত্সগুলির মতো সংগ্রহের সাথে কোনও হেরফের করতে হয়, তবে আইকুয়েরেবল ব্যবহার করুন
বাস্তব জীবনে আপনি যদি লিংক-টু-এসকিউএল এর মতো কোনও ORM ব্যবহার করে থাকেন
উভয় ক্ষেত্রেই যদি আপনি কোনও কল না করেন ToList()
বা ToArray()
ততক্ষণে এটি ব্যবহারের সময় ক্যোয়ারি কার্যকর করা হবে, সুতরাং, বলুন, আপনার কাছে একটি রয়েছে IQueryable<T>
এবং আপনি এটি থেকে 4 টি তালিকা বাক্স পূরণ করেন, তাহলে ক্যোয়ারীটি 4 বার ডাটাবেসের বিরুদ্ধে চালানো হবে।
এছাড়াও যদি আপনি আপনার প্রশ্নের সীমাবদ্ধ করে থাকেন:
q.Where(x.name = "a").ToList()
তারপরে একটি আইকিউয়েরেবলের সাথে উত্পাদিত এসকিউএল এর সাথে "যেখানে নাম =" এ "থাকবে তবে একটি আইনেউমারেবলের সাহায্যে আরও অনেকগুলি ভূমিকা ডাটাবেস থেকে ফিরে যাবে, তারপরে x.name =" a "চেকটি নেট দ্বারা সম্পন্ন হবে।
নীচে উল্লিখিত ছোট্ট পরীক্ষা আপনাকে IQueryable<T>
এবং এর মধ্যে পার্থক্যের একটি দিক বুঝতে সহায়তা করে IEnumerable<T>
। আমি এই পোস্টটি থেকে এই উত্তরটি পুনরুত্পাদন করেছি যেখানে আমি অন্য কারও পোস্টে সংশোধন যোগ করার চেষ্টা করছিলাম
আমি ডিবিতে (ডিডিএল স্ক্রিপ্ট) নিম্নলিখিত কাঠামো তৈরি করেছি:
CREATE TABLE [dbo].[Employee]([PersonId] [int] NOT NULL PRIMARY KEY,[Salary] [int] NOT NULL)
এখানে রেকর্ড সন্নিবেশ লিপি (ডিএমএল স্ক্রিপ্ট):
INSERT INTO [EfTest].[dbo].[Employee] ([PersonId],[Salary])VALUES(1, 20)
INSERT INTO [EfTest].[dbo].[Employee] ([PersonId],[Salary])VALUES(2, 30)
INSERT INTO [EfTest].[dbo].[Employee] ([PersonId],[Salary])VALUES(3, 40)
INSERT INTO [EfTest].[dbo].[Employee] ([PersonId],[Salary])VALUES(4, 50)
INSERT INTO [EfTest].[dbo].[Employee] ([PersonId],[Salary])VALUES(5, 60)
GO
এখন, আমার লক্ষ্যটি ছিল Employee
ডাটাবেসে টেবিল থেকে কেবল শীর্ষ 2 রেকর্ড প্রাপ্ত । আমি আমার কনসোল অ্যাপ্লিকেশনটিতে একটি ADO.NET সত্তা ডেটা মডেল আইটেমটি Employee
আমার ডেটাবেজে টেবিলের দিকে ইঙ্গিত করে লিনকিউ কোয়েরি লিখতে শুরু করি।
আইকিউয়েরেবল রুটের জন্য কোড :
using (var efContext = new EfTestEntities())
{
IQueryable<int> employees = from e in efContext.Employees select e.Salary;
employees = employees.Take(2);
foreach (var item in employees)
{
Console.WriteLine(item);
}
}
আমি যখন এই প্রোগ্রামটি চালাতে শুরু করেছি তখন আমি আমার এসকিউএল সার্ভারের উদাহরণে এসকিউএল ক্যোয়ারী প্রোফাইলারের একটি অধিবেশনও শুরু করেছিলাম এবং এখানে মৃত্যুদন্ড কার্যকর করার সংক্ষিপ্তসারটি দেওয়া হয়:
SELECT TOP (2) [c].[Salary] AS [Salary] FROM [dbo].[Employee] AS [c]
এটি কেবলমাত্র ডাটাবেস সার্ভারের পক্ষেই ক্লজটি IQueryable
প্রয়োগ করার জন্য যথেষ্ট স্মার্ট Top (2)
তাই এটি তারের মধ্যে 5 টির মধ্যে 2 টি রেকর্ড নিয়ে আসে। আর কোনও মেমোরি ফিল্টারিং ক্লায়েন্ট কম্পিউটারের পক্ষে প্রয়োজন হয় না।
আইনুনামেবল রুটের কোড :
using (var efContext = new EfTestEntities())
{
IEnumerable<int> employees = from e in efContext.Employees select e.Salary;
employees = employees.Take(2);
foreach (var item in employees)
{
Console.WriteLine(item);
}
}
এক্ষেত্রে মৃত্যুদন্ড কার্যকর করার সংক্ষিপ্তসার:
SELECT [Extent1].[Salary] AS [Salary]
FROM [dbo].[Employee] AS [Extent1]
এখন জিনিসটি টেবিলে IEnumerable
উপস্থিত সমস্ত 5 টি রেকর্ড আনা হয় Salary
এবং তারপরে শীর্ষ 2 রেকর্ড পাওয়ার জন্য ক্লায়েন্ট কম্পিউটারে একটি মেমরি ফিল্টার করে। সুতরাং আরও ডেটা (এই ক্ষেত্রে 3 টি অতিরিক্ত রেকর্ড) অকারণে তারের উপর স্থানান্তরিত হয়েছে।
আমি এই জাতীয় পোস্টটিতে যা লিখেছি তা এখানে (এই বিষয়টিতে)। (এবং না, আমি সাধারণত নিজেকে উদ্ধৃত করি না, তবে এগুলি খুব ভাল নিবন্ধ))
"এই নিবন্ধটি সহায়ক: আইকিউয়েরেবল বনাম আইএনকিউরেবল লিংক-টু-এসকিউএল-এ ।
এই নিবন্ধটি উদ্ধৃত করে, 'এমএসডিএন ডকুমেন্টেশন অনুসারে আইকুয়েরেবলের উপর কলগুলি তার পরিবর্তে অভ্যন্তরীণ অভিব্যক্তি গাছ তৈরি করে পরিচালনা করে। "এই পদ্ধতিগুলি যা আইকিউয়েরেবল (টি অফ) প্রসারিত করে সরাসরি কোনও অনুসন্ধান করে না Instead পরিবর্তে, তাদের কার্যকারিতা হ'ল এক্সপ্রেশন অবজেক্ট তৈরি করা, যা একটি এক্সপ্রেশন ট্রি যা সংশ্লেষিত ক্যোয়ারিকে উপস্থাপন করে।"
সি # এবং। নেট প্ল্যাটফর্মে এক্সপ্রেশন গাছগুলি একটি অত্যন্ত গুরুত্বপূর্ণ নির্মাণ। (এগুলি সাধারণভাবে গুরুত্বপূর্ণ, তবে সি # তাদেরকে খুব দরকারী করে তোলে)) পার্থক্যটি আরও ভালভাবে বুঝতে, আমি এখানে অফিসিয়াল সি # 5.0 স্পেসিফিকেশনে অভিব্যক্তি এবং বিবৃতিগুলির মধ্যে পার্থক্য সম্পর্কে পড়ার পরামর্শ দিই । লম্বা ক্যালকুলাসে উন্নত তাত্ত্বিক ধারণাগুলির জন্য, এক্সপ্রেশনগুলি প্রথম শ্রেণীর অবজেক্ট হিসাবে পদ্ধতিগুলির জন্য সমর্থন সক্ষম করে। আইকিউয়েরেবল এবং আইনিউমারেবলের মধ্যে পার্থক্য এই পয়েন্টকে কেন্দ্র করে। আইকিউয়েরেবল এক্সপ্রেশন ট্রি তৈরি করে যেখানে আইনিউবারেবল কমপক্ষে আমাদের মধ্যে যারা মাইক্রোসফ্টের গোপন ল্যাবগুলিতে কাজ করেন না তাদের জন্য সাধারণ শর্তে নয়।
এখানে অন্য একটি খুব দরকারী নিবন্ধ যা পুশ বনাম টান দৃষ্টিকোণ থেকে পার্থক্যগুলি বর্ণনা করে। ("পুশ" বনাম "টান দিয়ে," আমি তথ্য প্রবাহের দিক নির্দেশ করছি।। নেট এবং সি # এর জন্য প্রতিক্রিয়াশীল প্রোগ্রামিং প্রযুক্তি
এখানে একটি খুব ভাল নিবন্ধ যা বিবৃতি ল্যাম্বডাস এবং এক্সপ্রেশন ল্যাম্বডাসের মধ্যে পার্থক্যের বিবরণ দেয় এবং আরও গভীরতার সাথে অভিব্যক্তি ট্রেসের ধারণাগুলি নিয়ে আলোচনা করে: সি # প্রতিনিধি, এক্সপ্রেশন ট্রি এবং ল্যাম্বদা স্টেটমেন্ট বনাম ল্যাম্বদা এক্সপ্রেশনগুলিতে পুনর্বিবেচনা করছেন। । "
আমরা ডেটাবেস থেকে পুনরুদ্ধার করা ডেটা ব্যবহার করি IEnumerable
এবং IQueryable
পরিচালনা করি। IQueryable
উত্তরাধিকার সূত্রে প্রাপ্ত IEnumerable
, তাই IQueryable
সমস্ত IEnumerable
বৈশিষ্ট্য ধারণ করে । মধ্যে প্রধান পার্থক্য IQueryable
এবং IEnumerable
যে IQueryable
ফিল্টার সঙ্গে, executes ক্যোয়ারী যেহেতু IEnumerable
, executes ক্যোয়ারী প্রথম এবং তারপর এটি অবস্থার উপর ভিত্তি করে ডেটা ফিল্টার করে।
নীচে আরও বিস্তারিত পার্থক্য খুঁজে:
IEnumerable
IEnumerable
System.Collections
নেমস্পেসে বিদ্যমানIEnumerable
সার্ভার সাইডে একটি নির্বাচিত ক্যোয়ারী চালাও, ক্লায়েন্ট-সাইডে মেমরি ইন ডেটা লোড করুন এবং তারপরে ডেটা ফিল্টার করুনIEnumerable
তালিকা, অ্যারের মতো মেমরির সংগ্রহ থেকে ডেটা অনুসন্ধানের জন্য উপযুক্তIEnumerable
লিনকু টু অবজেক্ট এবং লিনকু থেকে এক্সএমএল ক্যোয়ারীগুলির পক্ষে উপকারীIQueryable
IQueryable
System.Linq
নেমস্পেসে বিদ্যমানIQueryable
সমস্ত ফিল্টার সহ সার্ভার-সাইডে একটি 'নির্বাচন করুন ক্যোয়ারী' চালায়IQueryable
আউট-মেমোরি (যেমন রিমোট ডাটাবেস, পরিষেবা) সংগ্রহ থেকে ডেটা অনুসন্ধানের জন্য উপযুক্তIQueryable
লিনকু থেকে এসকিউএল অনুসন্ধানগুলির জন্য উপকারীসুতরাং IEnumerable
সাধারণত ইন-মেমোরি সংগ্রহে ডিল করার জন্য ব্যবহৃত হয়, অন্যদিকে IQueryable
সংগ্রহগুলি পরিচালনা করতে সাধারণত ব্যবহৃত হয়।
আইইনুমেবল এবং আইকিউয়ারিযোগ্য উভয়ই কোনও ডেটা সংগ্রহ এবং ডেটা ম্যানিপুলেশন অপারেশন সম্পাদনের জন্য উদাহরণস্বরূপ ডেটা সংগ্রহের ক্ষেত্রে ফিল্টারিংয়ের জন্য ব্যবহৃত হয়। এখানে আপনি উদাহরণের সাথে সেরা পার্থক্য তুলনা খুঁজে পেতে পারেন। http://www.gurujipoint.com/2017/05/difference-between-ienumerable-and.html
আইকিউয়েরেবল আইনিম্যারেবলের চেয়ে দ্রুত হয় যদি আমরা ডাটাবেস থেকে বিপুল পরিমাণে ডেটা নিয়ে কাজ করি কারণ, আইকিউয়েরেবল কেবলমাত্র ডাটাবেস থেকে প্রয়োজনীয় ডেটা পায় যেখানে আইইনামেবল ডেটাবেস থেকে প্রয়োজনীয়তা নির্বিশেষে সমস্ত ডেটা পেয়ে যায়
অপরিবর্তনীয়: যখন আমরা ইনপ্রসেস মেমরি নিয়ে ডিল করতে চাই, অর্থাত্ ডেটা সংযোগ ব্যতীত: যখন এসকিউএল সার্ভারের সাথে ডিল করতে হয়, অর্থাত্ ডেটা সংযোগ আইলিস্ট সহ: অপারেশন যেমন অ্যাড অবজেক্ট, ডিলিট অবজেক্ট ইত্যাদি etc