দ্রুত তুলনা
| বিষয় | IEnumerable | IQueryable |
|---|---|---|
| নেমস্পেস | System.Collections | System.Linq |
| লেজি লোডিং | সাপোর্ট করে না | সাপোর্ট করে |
| ডেটাবেস কোয়েরি | সার্ভারে SELECT করে, ক্লায়েন্টে ফিল্টার করে | সার্ভারে সব ফিল্টারসহ কোয়েরি রান করে |
| এক্সটেনশন মেথড প্যারামিটার | ফাংশনাল অবজেক্ট (Func<T>) | এক্সপ্রেশন ট্রি (Expression<Func<T>>) |
| পারফরম্যান্স (DB-এ) | কম ভালো (অনাবশ্য ডেটা আনে) | ভালো (অপ্টিমাইজড SQL জেনারেট করে) |
IEnumerable উদাহরণ
using (var dc = new DbContext()) {
// Where ও Take দুটোই IEnumerable-এ রান হবে
IEnumerable<SocialMedia> list = dc.SocialMedias
.Where(p => p.Name.StartsWith("T"))
.ToList(); // এখানে ডেটাবেসে হিট করে
list = list.Take(1); // মেমরিতে ফিল্টার
}
জেনারেটেড SQL:
SELECT [t0].[ID], [t0].[Name] FROM [SocialMedia] AS [t0] WHERE [t0].[Name] LIKE @p0
লক্ষ্য করুন: TOP 1 নেই। পুরো রেজাল্ট সেট আসবে, তারপর লিনক টু অবজেক্টস Take(1) করবে।
IQueryable উদাহরণ
using (var dc = new DbContext()) {
// IQueryable চেইন থাকলে এক্সপ্রেশন ট্রি বিল্ড হবে
IQueryable<SocialMedia> list = dc.SocialMedias
.Where(p => p.Name.StartsWith("T"));
list = list.Take(1); // এখনও ডেটাবেসে হিট করেনি
var result = list.ToList(); // এখানে এক্সিকিউট হবে
}
জেনারেটেড SQL:
SELECT TOP 1 [t0].[ID], [t0].[Name] FROM [SocialMedia] AS [t0] WHERE [t0].[Name] LIKE @p0
লক্ষ্য করুন: TOP 1 SQL-এই রয়েছে। শুধু ১ রো আयेगा।
কোনটি কখন ব্যবহার করবেন?
- IEnumerable: ইন-মেমরি কালেকশন (List, Array), ছোট ডেটাসেট, LINQ to Objects
- IQueryable: ডেটাবেস (Entity Framework, LINQ to SQL), বড় ডেটাসেট, রিমোট ডেটা সোর্স
মনে রাখার কথা
// IEnumerable-এ কনভার্ট করলে লেজি লোডিং গিয়ে থাকে
IEnumerable<T> enumList = queryableList.AsEnumerable();
// IQueryable-এ কনভার্ট করা যায় না (রিভার্স নয়)