استعلامات LINQ إلى DataTable في C#: دليل شامل مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل مع DataTable عبر LINQ: من المبتدئ إلى المحترف في 20 دقيقة

\n\n

تخيل الموقف: أنت تكتب تطبيقًا بلغة C#، وتقوم بتحميل البيانات من قاعدة البيانات إلى DataTable، ثم... تحتاج إلى تصفية الصفوف وفق شرط معقد، أو تجميعها حسب التاريخ، أو دمج جدولين. الطريقة القديمة DataTable.Select("...") مع مرشحاتها النصية تنهار عند الشرط الثاني، بينما حلقات foreach تحول الكود إلى معكرونة.

\n\n

هل هذا مألوف؟ إذن مرحبًا بك في عالم استعلامات LINQ إلى DataTable. هذه هي أداتك الفائقة التي تحول العمل مع البيانات الجدولية إلى كود أنيق، قابل للقراءة وقوي. في هذا الدليل، سنغطي كل شيء: من Where الأساسي إلى Join و GroupBy المتقدمة. هيا بنا!

\n\n
\n\n

ما هو LINQ to DataSet ولماذا تحتاجه؟

\n\n

LINQ (Language Integrated Query) هي لغة استعلام مدمجة في C#. ميزتها الرئيسية: تكتب استعلامات لأي بيانات (مصفوفات، قوائم، XML، قواعد بيانات) بنفس الطريقة - باستخدام العوامل المألوفة from و where و select.

\n\n

لكن مع DataTable هناك فارق: لا يمكن تطبيق LINQ مباشرة عليه. DataTable لا ينفذ واجهة IEnumerable<T>. الحل هو طريقة AsEnumerable() التي تحول الجدول إلى مجموعة من كائنات DataRow. وهذه هي المجموعة التي يعمل معها LINQ.

\n\n

مزايا هذه الطريقة:

\n
    \n
  • ✅ أمان الأنواع: المترجم يكتشف الأخطاء في أسماء الأعمدة
  • \n
  • ✅ قابلية القراءة: الكود يشبه SQL لكنه يبقى C#
  • \n
  • ✅ القوة: التصفية، الإسقاط، التجميع، الترتيب - بسطر واحد
  • \n
  • ✅ الأداء: التنفيذ المؤجل (لا يحمل بيانات زائدة)
  • \n
\n\n

لنبدأ فورًا. قم بتثبيت مرجع System.Data.DataSetExtensions في مشروعك (عادة ما يكون موجودًا) - وانطلق.

\n\n
\n\n

إعداد البيانات: جدول الاختبار الخاص بنا

\n\n

لكي لا نكون مجرد كلام، سننشئ DataTable يحتوي على بيانات المنتجات. الكود أدناه هو أساسنا لجميع الأمثلة:

\n\n
// 1. إنشاء جدول بأعمدة\nDataTable products = new DataTable("Products");\nproducts.Columns.Add("Id", typeof(int));\nproducts.Columns.Add("Name", typeof(string));\nproducts.Columns.Add("Category", typeof(string));\nproducts.Columns.Add("Price", typeof(decimal));\nproducts.Columns.Add("DateAdded", typeof(DateTime));\n\n// 2. إضافة صفوف\nproducts.Rows.Add(1, "لابتوب ASUS", "إلكترونيات", 55000, DateTime.Now.AddDays(-10));\nproducts.Rows.Add(2, "فأرة Logitech", "إلكترونيات", 2500, DateTime.Now.AddDays(-5));\nproducts.Rows.Add(3, "كتاب 'C# in Depth'", "كتب", 1800, DateTime.Now.AddDays(-2));\nproducts.Rows.Add(4, "سماعات Sony", "إلكترونيات", 12000, DateTime.Now.AddDays(-1));\nproducts.Rows.Add(5, "دفتر Moleskine", "قرطاسية", 1200, DateTime.Now.AddDays(-20));\nproducts.Rows.Add(6, "قلم Parker", "قرطاسية", 3500, DateTime.Now.AddDays(-15));\nproducts.Rows.Add(7, "شاشة Dell", "إلكترونيات", 32000, DateTime.Now.AddDays(-30));
\n\n

الآن لدينا 7 منتجات. حان وقت تطبيق سحر LINQ.

\n\n
\n\n

استعلامات LINQ الأساسية إلى DataTable

\n\n

1. التصفية (Where) - مثل SQL WHERE

\n\n

لنفترض أننا نريد اختيار جميع المنتجات التي يزيد سعرها عن 10,000 روبل. بدون LINQ، كنت ستكتب حلقة مع التحقق من row["Price"]. مع LINQ يبدو الأمر هكذا:

\n\n
var expensiveProducts = products.AsEnumerable()\n    .Where(row => row.Field<decimal>("Price") > 10000);\n\nforeach (var row in expensiveProducts)\n{\n    Console.WriteLine($"{row["Name"]} - {row["Price"]} روبل");\n}\n// الإخراج: لابتوب ASUS - 55000، سماعات Sony - 12000، شاشة Dell - 32000
\n\n

نقطة مهمة: استخدم طريقة Field<T>("ColumnName") بدلاً من التحويل المباشر (decimal)row["Price"]. هذا أكثر أمانًا: إذا كان العمود DBNull، فإن Fie

المدونات

توصيات الكتب