LINQ - Differences between IEnumerable and IQueryable

الفرق بين IEnumerable و IQueryable في C#

في C# LINQ، هناك نوعان رئيسيان من الواجهات المستخدمة للاستعلام عن البيانات:

  • IEnumerable
  • IQueryable

يُعد فهم الفرق بينهما أمرًا أساسيًا لتحسين أداء التطبيقات، خاصة عند التعامل مع قواعد البيانات و مجموعات البيانات الكبيرة.


1. ما هي IEnumerable?

🔹 المساحة: System.Collections.Generic

🔹 مكان التنفيذ: في الذاكرة (In-Memory)

🔹 التنفيذ: فوري (Immediate Execution)

🔹 مصدر البيانات: مثل List و Array

🔹 الأداء: أقل كفاءة مع البيانات الكبيرة

مثال:

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

        IEnumerable<int> evenNumbers = numbers.Where(n => n % 2 == 0);

        foreach (var num in evenNumbers)
        {
            Console.WriteLine(num);
        }
    }
}

كيف يعمل؟

  • يتم تحميل البيانات كاملة ثم تصفيتها في الذاكرة.
  • لا يتم توليد SQL.

2. ما هي IQueryable?

🔹 المساحة: System.Linq

🔹 مكان التنفيذ: في قاعدة البيانات

🔹 التنفيذ: مؤجل (Deferred Execution)

🔹 مصدر البيانات: EF أو LINQ to SQL

🔹 الأداء: أعلى مع البيانات الكبيرة

مثال:

using System;
using System.Linq;
using Microsoft.EntityFrameworkCore;

class Program
{
    static void Main()
    {
        using (var context = new MyDbContext())
        {
            IQueryable<Employee> employees = context.Employees.Where(emp => emp.Salary > 5000);

            foreach (var emp in employees)
            {
                Console.WriteLine(emp.Name);
            }
        }
    }
}

كيف يعمل؟

  • يتم توليد استعلام SQL وتطبيق الفلترة في قاعدة البيانات.
  • فقط البيانات المطلوبة يتم تحميلها.

3. مقارنة بينهما:

  • IEnumerable: للبيانات الصغيرة داخل الذاكرة
  • IQueryable: لاستعلامات قواعد البيانات

4. مثال عملي يوضح الفرق:

استخدام IEnumerable (تحميل كامل البيانات):

List<Employee> employees = context.Employees.ToList();
IEnumerable<Employee> filteredEmployees = employees.Where(emp => emp.Salary > 5000);

استخدام IQueryable (تنفيذ الاستعلام في قاعدة البيانات):

IQueryable<Employee> filteredEmployees = context.Employees.Where(emp => emp.Salary > 5000);

5. خلاصة

  • IEnumerable: ينفذ الاستعلام داخل التطبيق.
  • IQueryable: ينفذ الاستعلام داخل قاعدة البيانات.

🎯 نصيحة: استخدم IQueryable لتحسين الأداء عند التعامل مع قواعد البيانات.

تعليقات

المشاركات الشائعة من هذه المدونة

C# - Arrays

Entity Framework - ما هو ORM؟ ونبذة عن Dapper وNHibernate

Entity Framework - مقدمة عن Entity Framework