DataTable के साथ LINQ: 20 मिनट में शुरुआत से मास्टर तक
\n\nएक स्थिति की कल्पना करें: आप C# में एक एप्लिकेशन लिख रहे हैं, डेटाबेस से DataTable में डेटा लोड करते हैं, और फिर… आपको जटिल शर्तों के आधार पर पंक्तियों को फ़िल्टर करना, तारीख के अनुसार ग्रुप करना, या दो टेबल को जोड़ना है। पुराना DataTable.Select("...") अपने स्ट्रिंग-आधारित फ़िल्टर के साथ दूसरी शर्त पर ही टूट जाता है, और foreach लूप कोड को स्पेगेटी में बदल देते हैं।
परिचित लग रहा है? तो DataTable पर LINQ क्वेरी की दुनिया में आपका स्वागत है। यह आपका सुपर-टूल है जो टेबुलर डेटा के साथ काम को सुरुचिपूर्ण, पढ़ने योग्य और शक्तिशाली कोड में बदल देता है। इस गाइड में, हम सब कुछ कवर करेंगे: बुनियादी Where से लेकर एडवांस्ड Join और GroupBy तक। चलिए शुरू करते हैं!
\n\n
LINQ to DataSet क्या है और इसकी आवश्यकता क्यों है?
\n\nLINQ (Language Integrated Query) C# में बिल्ट-इन क्वेरी भाषा है। इसकी सबसे बड़ी खासियत: आप किसी भी डेटा (ऐरे, लिस्ट, XML, डेटाबेस) पर एक ही तरह से क्वेरी लिख सकते हैं — परिचित ऑपरेटरों from, where, select का उपयोग करके।
लेकिन DataTable के साथ एक समस्या है: आप सीधे LINQ लागू नहीं कर सकते। DataTable IEnumerable<T> इंटरफ़ेस को इम्प्लीमेंट नहीं करता। समाधान है — AsEnumerable() मेथड, जो टेबल को DataRow ऑब्जेक्ट्स के कलेक्शन में बदल देता है। LINQ इसी कलेक्शन पर काम करता है।
इस दृष्टिकोण के लाभ:
\n- \n
- ✅ टाइप-सेफ्टी: कंपाइलर कॉलम नामों में गलतियाँ पकड़ लेता है \n
- ✅ पढ़ने में आसान: कोड SQL जैसा दिखता है, लेकिन C# ही रहता है \n
- ✅ शक्तिशाली: फ़िल्टरिंग, प्रोजेक्शन, ग्रुपिंग, सॉर्टिंग — एक लाइन में \n
- ✅ परफॉरमेंस: डिफर्ड एक्ज़ीक्यूशन (अनावश्यक डेटा लोड नहीं होता) \n
चलिए सीधे काम पर आते हैं। अपने प्रोजेक्ट में System.Data.DataSetExtensions का रेफरेंस जोड़ें (आमतौर पर पहले से होता है) — और शुरू करें।
\n\n
डेटा तैयार करना: हमारी टेस्ट टेबल
\n\nबिना उदाहरण के बात अधूरी है, तो चलिए प्रोडक्ट्स डेटा वाला एक DataTable बनाते हैं। नीचे दिया गया कोड सभी उदाहरणों का आधार है:
// 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
DataTable पर बुनियादी LINQ क्वेरी
\n\n1. फ़िल्टरिंग (Where) — SQL WHERE की तरह
\n\nमान लीजिए, आपको 10,000 रुपये से अधिक के सभी प्रोडक्ट्स चुनने हैं। LINQ के बिना, आपको row["Price"] चेक करने वाला लूप लिखना पड़ता। LINQ के साथ यह इस तरह दिखता है:
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महत्वपूर्ण बात: सीधे कास्टिंग (decimal)row["Price"] के बजाय Field<T>("ColumnName") मेथड का उपयोग करें। यह अधिक सुरक्षित है: अगर कॉलम DBNull है, तो Field