LINQ - त्वरित गाइड

दुनिया भर के डेवलपर्स को परिभाषित पथ की कमी के कारण डेटा को क्वेरी करने में हमेशा समस्याओं का सामना करना पड़ता है और SQL, वेब सेवा, XQuery, आदि जैसी कई तकनीकों को मास्टर करने की आवश्यकता होती है।

दृश्य स्टूडियो 2008 में प्रस्तुत किया गया और एंडर्स हेजेलबर्ग द्वारा डिजाइन किया गया, LINQ (भाषा एकीकृत क्वेरी) SQL, XML आदि क्वेरी भाषाओं के ज्ञान के बिना भी प्रश्न लिखने की अनुमति देता है। LINQ क्वेरी को विविध डेटा प्रकारों के लिए लिखा जा सकता है।

LINQ क्वेरी का उदाहरण

सी#

using System;
using System.Linq;

class Program {
   static void Main() {
   
      string[] words = {"hello", "wonderful", "LINQ", "beautiful", "world"};
		
      //Get only short words
      var shortWords = from word in words where word.Length <= 5 select word;
	    
      //Print each word out
      foreach (var word in shortWords) {
         Console.WriteLine(word);
      }	 
		
      Console.ReadLine();
   }
}

वीबी

Module Module1
   Sub Main()
      Dim words As String() = {"hello", "wonderful", "LINQ", "beautiful", "world"}
     
      ' Get only short words
      Dim shortWords = From word In words _ Where word.Length <= 5 _ Select word
     
      ' Print each word out.
	  
      For Each word In shortWords
         Console.WriteLine(word)
      Next
	  
      Console.ReadLine()
   End Sub
End Module

जब C # या VB के उपरोक्त कोड को संकलित और निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

hello 
LINQ 
world

LINQ का सिंटेक्स

LINQ के दो सिंटेक्स हैं। ये निम्नलिखित हैं।

लैम्डा (विधि) सिंटेक्स

var longWords = words.Where( w ⇒ w.length > 10);
Dim longWords = words.Where(Function(w) w.length > 10)

क्वेरी (समझ) सिंटेक्स

var longwords = from w in words where w.length > 10;
Dim longwords = from w in words where w.length > 10

LINQ के प्रकार

LINQ के प्रकार संक्षेप में नीचे बताए गए हैं।

  • LINQ ऑब्जेक्ट्स के लिए
  • LINQ to XML (XLINQ)
  • LINQ to DataSet
  • LINQ to SQL (DLINQ)
  • LINQ संस्थाओं को

उपरोक्त के अलावा, PLINQ नाम का एक LINQ प्रकार भी है जो Microsoft का समानांतर LINQ है।

.NET में LINQ आर्किटेक्चर

LINQ में 3 लेयर्ड आर्किटेक्चर है जिसमें ऊपर की लेयर लैंग्वेज एक्सटेंशन होती है और बॉटम लेयर में डेटा सोर्स होते हैं जो आमतौर पर IEnumerable <T> या IQueryable <T> जेनेरिक इंटरफेस को लागू करने वाली ऑब्जेक्ट होते हैं। वास्तुकला नीचे दिखाया गया है।

क्वेरी एक्सप्रेशंस

क्वेरी अभिव्यक्ति और कुछ नहीं बल्कि एक LINQ क्वेरी है, जिसे SQL संचालक के समान रूप में अभिव्यक्त किया जाता है जैसे Select, Where और OrderBy जैसे क्वेरी ऑपरेटर्स के साथ। क्वेरी अभिव्यक्तियाँ आमतौर पर "From" कीवर्ड से शुरू होती हैं।

मानक LINQ क्वेरी ऑपरेटरों तक पहुँचने के लिए, namespace System.Query को डिफ़ॉल्ट रूप से आयात किया जाना चाहिए। इन अभिव्यक्तियों को एक घोषणात्मक क्वेरी सिंटैक्स के भीतर लिखा गया है जो C # 3.0 था।

नीचे एक संपूर्ण क्वेरी ऑपरेशन दिखाने के लिए एक उदाहरण है जिसमें डेटा स्रोत निर्माण, क्वेरी अभिव्यक्ति परिभाषा और क्वेरी निष्पादन शामिल हैं।

सी#

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

namespace Operators {
   class LINQQueryExpressions {
      static void Main() {
      
         // Specify the data source.
         int[] scores = new int[] { 97, 92, 81, 60 };

         // Define the query expression.
         IEnumerable<int> scoreQuery = from score in scores where score > 80 select score;

         // Execute the query.
		 
         foreach (int i in scoreQuery) {
            Console.Write(i + " ");
         }
		 
         Console.ReadLine();
      }
   }
}

जब उपरोक्त कोड संकलित और निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

97 92 81

एक्सटेंशन के तरीके

.NET 3.5 के साथ प्रस्तुत किया गया है, एक्सटेंशन विधियों को केवल स्थिर कक्षाओं में घोषित किया गया है और किसी वर्ग के वास्तविक सदस्य के बिना एक वर्ग का विस्तार करने के लिए कुछ सटीक क्वेरी संचालन करने के लिए ऑब्जेक्ट में कस्टम विधियों को शामिल करने की अनुमति देता है। इन्हें ओवरलोड भी किया जा सकता है।

संक्षेप में, विस्तार विधियों का उपयोग क्वेरी अभिव्यक्तियों को पारंपरिक विधि कॉल (ऑब्जेक्ट-ओरिएंटेड) में अनुवाद करने के लिए किया जाता है।

LINQ और संग्रहित प्रक्रिया के बीच अंतर

LINQ और Stored प्रक्रियाओं के बीच अंतर का एक सरणी मौजूद है। इन अंतरों का उल्लेख नीचे किया गया है।

  • LINQ क्वेरी की तुलना में संग्रहीत कार्यविधियाँ बहुत तेज़ हैं क्योंकि वे एक अपेक्षित निष्पादन योजना का पालन करते हैं।

  • एक संग्रहीत कार्यविधि की तुलना में एक LINQ क्वेरी को निष्पादित करते समय रन-टाइम त्रुटियों से बचना आसान है क्योंकि पूर्व में विजुअल स्टूडियो के Intellisense समर्थन के साथ-साथ संकलन-समय के दौरान पूर्ण-प्रकार की जाँच है।

  • LINQ .NET डिबगर का उपयोग करके डिबगिंग की अनुमति देता है जो संग्रहीत कार्यविधियों के मामले में नहीं है।

  • LINQ संग्रहीत प्रक्रियाओं के विपरीत कई डेटाबेस के लिए समर्थन प्रदान करता है, जहां विभिन्न प्रकार के डेटाबेस के लिए कोड को फिर से लिखना आवश्यक है।

  • संग्रहीत प्रक्रियाओं के एक सेट की तैनाती की तुलना में LINQ आधारित समाधान की तैनाती आसान और सरल है।

LINQ के लिए चाहिए

LINQ से पहले C #, SQL और विभिन्न API सीखना आवश्यक था जो दोनों को एक साथ बाँध कर एक पूर्ण अनुप्रयोग बनाते हैं। चूंकि, ये डेटा स्रोत और प्रोग्रामिंग भाषा एक बाधा बेमेल का सामना करते हैं; शॉर्ट कोडिंग की आवश्यकता महसूस की जाती है।

नीचे एक उदाहरण दिया गया है कि LINQ के आगमन से पहले डेटा की क्वेरी करते समय डेवलपर्स द्वारा कितनी विविध तकनीकों का उपयोग किया गया था।

SqlConnection sqlConnection = new SqlConnection(connectString);
SqlConnection.Open();

System.Data.SqlClient.SqlCommand sqlCommand = new SqlCommand();
sqlCommand.Connection = sqlConnection;

sqlCommand.CommandText = "Select * from Customer";
return sqlCommand.ExecuteReader (CommandBehavior.CloseConnection)

दिलचस्प है, विशेष रुप से कोड लाइनों से बाहर, क्वेरी केवल अंतिम दो द्वारा परिभाषित की जाती है। LINQ का उपयोग करते हुए, एक ही डेटा क्वेरी को पठनीय रंग-कोडित रूप में लिखा जा सकता है जैसे कि नीचे उल्लेख किया गया है वह भी बहुत कम समय में।

Northwind db = new Northwind(@"C:\Data\Northwnd.mdf");
var query = from c in db.Customers select c;

LINQ के फायदे

LINQ फायदे का एक मेजबान प्रदान करता है और उनमें से सबसे महत्वपूर्ण अपनी शक्तिशाली अभिव्यक्ति है जो डेवलपर्स को घोषित रूप से व्यक्त करने में सक्षम बनाता है। LINQ के कुछ अन्य फायदे नीचे दिए गए हैं।

  • LINQ सिंटैक्स हाइलाइटिंग प्रदान करता है जो डिज़ाइन समय के दौरान गलतियों का पता लगाने में मददगार साबित होता है।

  • LINQ IntelliSense प्रदान करता है जिसका अर्थ है आसानी से और अधिक सटीक प्रश्न लिखना।

  • LINQ में कोड लिखना काफी तेज है और इस तरह विकास का समय भी काफी कम हो जाता है।

  • LINQ C # भाषा में अपने एकीकरण के कारण आसान डिबगिंग बनाता है।

  • दो तालिकाओं के बीच संबंध को देखना इसकी श्रेणीबद्ध विशेषता के कारण LINQ के साथ आसान है और यह कम समय में कई तालिकाओं में शामिल होने वाले प्रश्नों की रचना करने में सक्षम बनाता है।

  • LINQ कई विविध डेटा स्रोतों को क्वेरी करते हुए एक LINQ सिंटैक्स के उपयोग की अनुमति देता है और इसका मुख्य कारण इसकी एकात्मक नींव है।

  • LINQ एक्स्टेंसिबल है जिसका अर्थ है कि नए डेटा स्रोत प्रकारों को क्वेरी करने के लिए LINQ के ज्ञान का उपयोग करना संभव है।

  • LINQ एक ही क्वेरी में कई डेटा स्रोतों के साथ-साथ जटिल समस्याओं को तोड़ने के लिए आसान प्रश्नों को डिबग करने के लिए आसान बनाने में शामिल होने की सुविधा प्रदान करता है।

  • LINQ XML डेटा को XML डेटा में बदलने की तरह एक डेटा प्रकार के रूपांतरण के लिए आसान परिवर्तन प्रदान करता है।

LINQ प्रोग्राम के साथ शुरू करने से पहले, सबसे पहले LINQ पर्यावरण की स्थापना की बारीकियों को समझना सबसे अच्छा है। LINQ को .NET फ्रेमवर्क की जरूरत है, एक विविध प्रकार के अनुप्रयोगों के लिए एक क्रांतिकारी मंच। LINQ क्वेरी को C # या Visual Basic में आसानी से लिखा जा सकता है।

Microsoft इन दोनों भाषाओं यानी C # और Visual Basic के लिए विजुअल स्टूडियो के माध्यम से टूल प्रदान करता है। हमारे उदाहरण सभी को संकलित और विज़ुअल स्टूडियो 2010 में लिखे गए हैं। हालांकि, विज़ुअल बेसिक 2013 संस्करण भी उपयोग के लिए उपलब्ध है। यह नवीनतम संस्करण है और इसमें विजुअल स्टूडियो 2012 के साथ कई समानताएं हैं।

विंडोज 7 पर विजुअल स्टूडियो 2010 स्थापित हो रहा है

विजुअल स्टूडियो को किसी इंस्टालेशन मीडिया से डीवीडी की तरह इंस्टॉल किया जा सकता है। व्‍यवस्‍थापक क्रेडेंशियल को आपके सिस्टम पर सफलतापूर्वक Visual Basic 2010 स्थापित करने के लिए आवश्यक है। स्थापना से पहले सिस्टम से सभी हटाने योग्य यूएसबी को डिस्कनेक्ट करना महत्वपूर्ण है अन्यथा स्थापना विफल हो सकती है। स्थापना के लिए आवश्यक कुछ हार्डवेयर आवश्यकताएं निम्नलिखित हैं।

हार्डवेयर आवश्यकताएँ

  • 1.6 GHz या उससे अधिक
  • 1 जीबी रैम
  • 3 जीबी (उपलब्ध हार्ड-डिस्क स्थान)
  • 5400 RPM हार्ड-डिस्क ड्राइव
  • DirectX 9 संगत वीडियो कार्ड
  • डीवीडी-रॉम ड्राइव

स्थापना कदम

Step 1 - विजुअल स्टूडियो 2010 पैकेज के साथ डीवीडी डालने के बाद सबसे पहले, पर क्लिक करें Install or run program from your media स्क्रीन पर एक पॉप-अप बॉक्स में दिखाई दे रहा है।

Step 2- अब विजुअल स्टूडियो के लिए सेट अप स्क्रीन पर दिखाई देगा। चुनेंInstall Microsoft Visual Studio 2010

Step 3- जैसे ही आप क्लिक करेंगे, यह प्रक्रिया शुरू हो जाएगी और एक सेट अप विंडो आपकी स्क्रीन पर दिखाई देगी। स्थापना घटकों के लोडिंग के पूरा होने के बाद जो कुछ समय लगेगा, पर क्लिक करेंNext अगले चरण पर जाने के लिए बटन।

Step 4 - यह इंस्टालेशन का अंतिम चरण है और एक स्टार्ट पेज दिखाई देगा जिसमें बस "मैंने लाइसेंस शर्तों को पढ़ा और स्वीकार किया है" चुनें और क्लिक करें Next बटन।

Step 5- अब अपनी स्क्रीन पर दिखने वाले विकल्प पृष्ठ से इंस्टॉल करने के लिए सुविधाओं का चयन करें। आप या तो चुन सकते हैंFull या Customविकल्प। यदि आपके पास डिस्क स्थान आवश्यकताओं में दिखाए गए आवश्यकता से कम डिस्क स्थान है, तो कस्टम पर जाएं।

Step 6- जब आप कस्टम विकल्प चुनते हैं, तो निम्न विंडो दिखाई देगी। उन सुविधाओं का चयन करें जिन्हें आप इंस्टॉल करना चाहते हैं और क्लिक करेंUpdate अन्यथा चरण 7 पर जाएं। हालांकि, यह सलाह दी जाती है कि भविष्य में कस्टम विकल्प के साथ न जाएं, आपको उन विशेषताओं की आवश्यकता हो सकती है जिन्हें आपने नहीं चुना है।

Step 7- जल्द ही एक पॉप अप विंडो दिखाई जाएगी और इंस्टॉलेशन शुरू हो जाएगा जिसमें एक लंबा समय लग सकता है। याद रखें, यह सभी घटकों को स्थापित करने के लिए है।

Step 8- अंत में, आप एक विंडो में एक संदेश देख पाएंगे कि इंस्टॉलेशन सफलतापूर्वक पूरा हो गया है। क्लिकFinish

दृश्य स्टूडियो 2010 में LINQ का उपयोग करके C # प्रोग्राम लिखना

  • विज़ुअल स्टूडियो 2010 अल्टीमेट संस्करण शुरू करें और मेनू से नई परियोजना के बाद फाइल चुनें।

  • एक नया प्रोजेक्ट डायलॉग बॉक्स आपकी स्क्रीन पर दिखाई देगा।

  • अब विजुअल C # को इंस्टॉल किए गए टेम्प्लेट के तहत एक श्रेणी के रूप में चुनें और अगला कंसोल एप्लिकेशन टेम्प्लेट चुनें जैसा कि नीचे दिए गए चित्र में दिखाया गया है।

  • नीचे नाम बॉक्स में अपनी परियोजना को एक नाम दें और ठीक दबाएं।

  • नया प्रोजेक्ट आपकी स्क्रीन पर एक नए डायलॉग बॉक्स के राइट-साइड में सोल्यूशन एक्सप्लोरर में दिखाई देगा।

  • अब समाधान एक्सप्लोरर से Program.cs चुनें और आप संपादक विंडो में कोड देख सकते हैं जो 'सिस्टम का उपयोग करके' से शुरू होता है।

  • यहां आप अपने निम्नलिखित C # प्रोग्राम को कोड करना शुरू कर सकते हैं।

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
			
namespace HelloWorld {
   class Program {
      static void Main(string[] args) {
      
         Console.WriteLine("Hello World")
         Console.ReadKey();
      } 		
   }
}
  • F5 कुंजी दबाएं और अपनी परियोजना चलाएं। यह चुनने से परियोजना को बचाने के लिए अत्यधिक अनुशंसित हैFileSave All प्रोजेक्ट चलाने से पहले।

दृश्य स्टूडियो 2010 में LINQ का उपयोग करके VB प्रोग्राम लिखना

  • विज़ुअल स्टूडियो 2010 अल्टीमेट संस्करण शुरू करें और मेनू से नई परियोजना के बाद फाइल चुनें।

  • एक नया प्रोजेक्ट डायलॉग बॉक्स आपकी स्क्रीन पर दिखाई देगा।

  • अब विजुअल बेसिक को स्थापित टेम्प्लेट के तहत एक श्रेणी के रूप में चुना और अगला कंसोल एप्लिकेशन टेम्प्लेट चुनें।

  • नीचे नाम बॉक्स में अपनी परियोजना को एक नाम दें और ठीक दबाएं।

  • आपको Module1.vb के साथ एक स्क्रीन मिलेगी। LINQ का उपयोग करके यहाँ अपना VB कोड लिखना शुरू करें।

Module Module1

   Sub Main()
      Console.WriteLine("Hello World")
      Console.ReadLine()
   End Sub
   
End Module
  • F5 कुंजी दबाएं और अपनी परियोजना चलाएं। यह चुनने से परियोजना को बचाने के लिए अत्यधिक अनुशंसित हैFileSave All प्रोजेक्ट चलाने से पहले।

जब C # या VB के उपरोक्त कोड को चलाया और चलाया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

Hello World

विस्तार विधियों के एक सेट को क्वेरी पैटर्न के रूप में जाना जाता है, जिसे LINQ Standard Query Operators के रूप में जाना जाता है। LINQ क्वेरी अभिव्यक्तियों के निर्माण के रूप में, ये ऑपरेटर फ़िल्टरिंग, सॉर्टिंग, प्रोजेक्शन, एग्रीगेशन आदि जैसे क्वेरी क्षमताओं की एक श्रृंखला प्रदान करते हैं।

LINQ मानक क्वेरी ऑपरेटरों को उनकी कार्यक्षमता के आधार पर निम्नलिखित में वर्गीकृत किया जा सकता है।

  • फ़िल्टरिंग ऑपरेटर्स
  • संचालकों में शामिल हों
  • प्रोजेक्शन ऑपरेशन
  • छँटाई करने वाले संचालक
  • समूह संचालक
  • Conversions
  • Concatenation
  • Aggregation
  • मात्रात्मक संचालन
  • विभाजन संचालन
  • जनरेशन ऑपरेशन
  • संचालन सेट करें
  • Equality
  • तत्व संचालक

फ़िल्टरिंग ऑपरेटर्स

फ़िल्टरिंग परिणाम सेट को प्रतिबंधित करने के लिए एक ऑपरेशन है जैसे कि यह केवल चयनित तत्वों को किसी विशेष स्थिति को संतुष्ट करता है।

उदाहरण दिखाएं

ऑपरेटर विवरण सी # क्वेरी एक्सप्रेशन सिंटैक्स VB क्वेरी अभिव्यक्ति सिंटैक्स
कहाँ पे एक विधेय फ़ंक्शन के आधार पर फ़िल्टर मान कहाँ पे कहाँ पे
OfType एक निर्दिष्ट प्रकार के रूप में उनकी क्षमता के आधार पर फ़िल्टर मान लागू नहीं लागू नहीं

संचालकों में शामिल हों

जुड़ना एक ऑपरेशन को संदर्भित करता है जिसमें डेटा स्रोतों को एक दूसरे के साथ संबंधों को सीधे तरीके से पालन करना मुश्किल होता है।

उदाहरण दिखाएं

ऑपरेटर विवरण सी # क्वेरी एक्सप्रेशन सिंटैक्स VB क्वेरी अभिव्यक्ति सिंटैक्स
शामिल हों ऑपरेटर मिलान कुंजी के आधार पर दो अनुक्रमों में शामिल होता है ... में शामिल होने पर ... के बराबर ... X में… से, y में… जहाँ xa = ya है
GroupJoin दो अनुक्रमों में शामिल हों और मिलान तत्वों को समूहित करें … में… पर… बराबर… ग्रुप जॉइन… इन… ऑन…

प्रोजेक्शन ऑपरेशन

प्रोजेक्शन एक ऑपरेशन है जिसमें एक ऑब्जेक्ट को केवल विशिष्ट गुणों के साथ एक पूरी तरह से नए रूप में बदल दिया जाता है।

उदाहरण दिखाएं

ऑपरेटर विवरण सी # क्वेरी एक्सप्रेशन सिंटैक्स VB क्वेरी अभिव्यक्ति सिंटैक्स
चुनते हैं ऑपरेटर एक ट्रांसफ़ॉर्म फ़ंक्शन के आधार पर वैल्यूज़ प्रोजेक्ट करता है चुनते हैं चुनते हैं
SelectMany ऑपरेटर मूल्यों के अनुक्रमों को प्रोजेक्ट करता है जो एक ट्रांसफ़ॉर्म फ़ंक्शन पर आधारित होते हैं और साथ ही उन्हें एक ही क्रम में समतल करते हैं खंडों से कई का उपयोग करें खंड से एकाधिक का उपयोग करें

छँटाई करने वाले संचालक

एक सॉर्टिंग ऑपरेशन एक एकल या अधिक विशेषताओं के आधार पर एक अनुक्रम के तत्वों को आदेश देने की अनुमति देता है।

उदाहरण दिखाएं

ऑपरेटर विवरण सी # क्वेरी एक्सप्रेशन सिंटैक्स VB क्वेरी अभिव्यक्ति सिंटैक्स
द्वारा आदेश ऑपरेटर एक बढ़ते क्रम में मूल्यों को क्रमबद्ध करता है द्वारा आदेश द्वारा आदेश
OrderByDescending ऑपरेटर एक अवरोही क्रम में मूल्यों को क्रमबद्ध करता है आदेश ... अवरोही आदेश द्वारा ... अवरोही
तब तक एक आरोही क्रम में एक द्वितीयक छँटाई निष्पादित करता है द्वारा आदेश …, … द्वारा आदेश …, …
ThenByDescending एक अवरोही क्रम में एक द्वितीयक छँटाई निष्पादित करता है आदेश ..., उतरते हुए ऑर्डर बाय…, अवरोही
उलटना एक संग्रह में तत्वों के क्रम का उलटा प्रदर्शन करता है लागू नहीं लागू नहीं

समूह संचालक

ऑपरेटर कुछ समूहों में एक साझा साझा विशेषता के आधार पर डेटा डालते हैं।

उदाहरण दिखाएं

ऑपरेटर विवरण सी # क्वेरी एक्सप्रेशन सिंटैक्स VB क्वेरी अभिव्यक्ति सिंटैक्स
समूह द्वारा समूहों में आइटम के एक क्रम को व्यवस्थित करें और उन्हें आईजीग्रुपिंग <कुंजी, तत्व> के IEnumerable संग्रह के रूप में लौटाएं समूह… -या- समूह… द्वारा… में… समूह ... द्वारा ... में
देखने के लिए एक समूहीकरण ऑपरेशन निष्पादित करें जिसमें महत्वपूर्ण जोड़े का एक क्रम वापस आ गया है लागू नहीं लागू नहीं

रूपांतरण

ऑपरेटर इनपुट ऑब्जेक्ट के प्रकार को बदलते हैं और विभिन्न अनुप्रयोगों में उपयोग किया जाता है।

उदाहरण दिखाएं

ऑपरेटर विवरण सी # क्वेरी एक्सप्रेशन सिंटैक्स VB क्वेरी अभिव्यक्ति सिंटैक्स
AsEnumerable IEnumerable <T> के रूप में टाइप किया गया इनपुट लौटाता है लागू नहीं लागू नहीं
AsQueryable A (जेनेरिक) IEnumerable एक (जेनेरिक) IQueryable में परिवर्तित हो जाता है लागू नहीं लागू नहीं
कास्ट एक संग्रह के तत्वों की एक निर्दिष्ट प्रकार से कास्टिंग करता है स्पष्ट रूप से टाइप की गई श्रेणी चर का उपयोग करें। जैसे: शब्दों में स्ट्रिंग स्ट्रिंग से से ... के रूप में ...
OfType एक विशेष प्रकार के लिए डाली जाने वाली उनकी क्षमता के आधार पर, उनके आधार पर फ़िल्टर मूल्य लागू नहीं लागू नहीं
toArray फोर्सेस क्वेरी को निष्पादित करता है और संग्रह के रूपांतरण को एक अरै में परिवर्तित करता है लागू नहीं लागू नहीं
ToDictionary एक कुंजी चयनकर्ता फ़ंक्शन के आधार पर एक शब्दकोश <TKey, TValue> और LINQ क्वेरी के निष्पादन को लागू करता है लागू नहीं लागू नहीं
सूची बनाने के लिए एक सूची <T> के लिए एक संग्रह में परिवर्तित करके एक क्वेरी के निष्पादन को मजबूर करता है लागू नहीं लागू नहीं
देखने के लिए एक क्वेरी के निष्पादन को मजबूर करता है और एक मुख्य चयनकर्ता फ़ंक्शन के आधार पर तत्वों को लुकअप <TKey, Telement> में डाल देता है लागू नहीं लागू नहीं

कड़ी

दो अनुक्रमों का संघटन करता है और इसके संचालन के संदर्भ में संघ संचालक के समान है, सिवाय इसके कि यह डुप्लिकेट को नहीं हटाता है।

उदाहरण दिखाएं

ऑपरेटर विवरण सी # क्वेरी एक्सप्रेशन सिंटैक्स VB क्वेरी अभिव्यक्ति सिंटैक्स
concat एक एकल अनुक्रम के गठन के लिए दो अनुक्रमों को समतल किया जाता है। लागू नहीं लागू नहीं

एकत्रीकरण

किसी भी प्रकार के वांछित एकत्रीकरण करता है और LINQ में कस्टम एकत्रीकरण बनाने की अनुमति देता है।

उदाहरण दिखाएं

ऑपरेटर विवरण सी # क्वेरी एक्सप्रेशन सिंटैक्स VB क्वेरी अभिव्यक्ति सिंटैक्स
कुल कस्टम एकत्रीकरण ऑपरेशन करने के लिए एक संग्रह के मूल्यों पर कार्य करता है लागू नहीं लागू नहीं
औसत मूल्यों के संग्रह के औसत मूल्य की गणना की जाती है लागू नहीं औसत… औसत में…
गिनती संग्रह के भीतर एक विधेय समारोह को संतुष्ट करने वाले तत्वों को गिना जाता है लागू नहीं अलग… में… गणना में ()
LonCount एक विशाल संग्रह के भीतर एक विधेय समारोह को संतुष्ट करने वाले तत्वों को गिना जाता है लागू नहीं अलग… में… LongCount में ()
मैक्स एक संग्रह के भीतर अधिकतम मूल्य का पता लगाएं लागू नहीं अधिकतम… में… अधिकतम ()
मिनट एक संग्रह के भीतर मौजूद न्यूनतम मूल्य का पता लगाएं लागू नहीं अलग ... मिन में ()
योग संग्रह के भीतर मानों का योग ज्ञात कीजिए लागू नहीं समग्र ... में…

मात्रात्मक संचालन

ये ऑपरेटर एक बूलियन मान लौटाते हैं अर्थात सही या गलत जब एक अनुक्रम में कुछ या सभी तत्व एक विशिष्ट स्थिति को संतुष्ट करते हैं।

उदाहरण दिखाएं

ऑपरेटर विवरण सी # क्वेरी एक्सप्रेशन सिंटैक्स VB क्वेरी अभिव्यक्ति सिंटैक्स
सब यदि किसी अनुक्रम के सभी तत्व एक विधेय स्थिति को संतुष्ट करते हैं, तो 'True' लौटाता है लागू नहीं सकल… में… सभी में (…)
कोई भी एक अनुक्रम की खोज करके निर्धारित करता है कि क्या उसी का कोई तत्व एक निर्दिष्ट स्थिति को संतुष्ट करता है लागू नहीं अलग ... किसी में ()
शामिल एक 'ट्रू' मान लौटाता है अगर पाता है कि एक विशिष्ट तत्व एक अनुक्रम में है यदि अनुक्रम डो में वह विशिष्ट तत्व नहीं है, तो 'गलत' मान वापस आ जाता है लागू नहीं लागू नहीं

विभाजन संचालक

अनुक्रम के तत्वों को फिर से व्यवस्थित किए बिना और फिर उनमें से एक को वापस किए बिना एक इनपुट अनुक्रम को दो अलग-अलग वर्गों में विभाजित करें।

उदाहरण दिखाएं

ऑपरेटर विवरण सी # क्वेरी एक्सप्रेशन सिंटैक्स VB क्वेरी अभिव्यक्ति सिंटैक्स
छोड़ें एक अनुक्रम के भीतर कुछ निर्दिष्ट तत्वों को छोड़ देता है और शेष लोगों को वापस कर देता है लागू नहीं छोड़ें
SkipWhile केवल उस अपवाद के साथ छोड़ें जैसा कि छोड़ें जाने वाले तत्वों की संख्या बूलियन स्थिति द्वारा निर्दिष्ट की गई है लागू नहीं जबकि छोड़ें
लेना एक अनुक्रम से तत्वों की एक निर्दिष्ट संख्या लें और शेष लोगों को छोड़ दें लागू नहीं लेना
TakeWhile के रूप में ही ले लो तथ्य यह है कि लेने के लिए तत्वों की संख्या एक बूलियन स्थिति द्वारा निर्दिष्ट कर रहे हैं लागू नहीं जबकि ले लो

जनरेशन ऑपरेशन

मूल्यों का एक नया अनुक्रम जनरेशनल ऑपरेटरों द्वारा बनाया गया है।

उदाहरण दिखाएं

ऑपरेटर विवरण सी # क्वेरी एक्सप्रेशन सिंटैक्स VB क्वेरी अभिव्यक्ति सिंटैक्स
DefaultIfEmpty जब एक खाली अनुक्रम पर लागू किया जाता है, तो एक अनुक्रम में एक डिफ़ॉल्ट तत्व उत्पन्न करता है लागू नहीं लागू नहीं
खाली मूल्यों का एक खाली क्रम लौटाता है और सबसे सरल जनरेशनल ऑपरेटर है लागू नहीं लागू नहीं
रेंज एक संग्रह बनाता है जिसमें पूर्णांक या संख्याओं का क्रम होता है लागू नहीं लागू नहीं
दोहराना एक विशिष्ट लंबाई के दोहराया मूल्यों वाले अनुक्रम को उत्पन्न करता है लागू नहीं लागू नहीं

संचालन सेट करें

सेट ऑपरेशन के लिए चार ऑपरेटर हैं, प्रत्येक अलग-अलग मानदंडों के आधार पर परिणाम देता है।

उदाहरण दिखाएं

ऑपरेटर विवरण सी # क्वेरी एक्सप्रेशन सिंटैक्स VB क्वेरी अभिव्यक्ति सिंटैक्स
अलग यदि कोई डुप्लिकेट डेटा फ़िल्टर करके संग्रह से अद्वितीय मानों की सूची देता है लागू नहीं अलग
के सिवाय दो संग्रह के मूल्यों की तुलना करता है और एक संग्रह से उन लोगों को लौटाता है जो दूसरे संग्रह में नहीं हैं लागू नहीं लागू नहीं
इंटरसेक्ट पाया गया मानों का सेट दो अलग-अलग संग्रहों में समान है लागू नहीं लागू नहीं
संघ एक ही सूची में दो अलग-अलग संग्रह की सामग्री को जोड़ती है वह भी बिना किसी डुप्लिकेट सामग्री के लागू नहीं लागू नहीं

समानता

दो वाक्यों (गणना करने योग्य) की तुलना करता है और निर्धारित करता है कि वे एक सटीक मिलान हैं या नहीं।

उदाहरण दिखाएं

ऑपरेटर विवरण सी # क्वेरी एक्सप्रेशन सिंटैक्स VB क्वेरी अभिव्यक्ति सिंटैक्स
SequenceEqual बूलियन मान के परिणाम यदि दो अनुक्रम एक दूसरे के समान पाए जाते हैं लागू नहीं लागू नहीं

तत्व संचालक

DefaultIfEmpty को छोड़कर, सभी शेष आठ मानक क्वेरी तत्व ऑपरेटर एक संग्रह से एक ही तत्व वापस करते हैं।

उदाहरण दिखाएं

ऑपरेटर विवरण सी # क्वेरी एक्सप्रेशन सिंटैक्स VB क्वेरी अभिव्यक्ति सिंटैक्स
ElementAt एक संग्रह में एक विशिष्ट सूचकांक के भीतर मौजूद तत्व देता है लागू नहीं लागू नहीं
ElementAtOrDefault इस तथ्य को छोड़कर कि यह विशिष्ट सूचकांक सीमा से बाहर होने की स्थिति में भी डिफ़ॉल्ट मान देता है लागू नहीं लागू नहीं
प्रथम एक संग्रह के भीतर पहले तत्व को पुनः प्राप्त करता है या किसी विशिष्ट स्थिति को संतुष्ट करने वाला पहला तत्व है लागू नहीं लागू नहीं
FirstOrDefault तथ्य यह है कि यह भी इस तरह के तत्वों का कोई अस्तित्व नहीं होने की स्थिति में एक डिफ़ॉल्ट मान के अलावा पहले के रूप में ही लागू नहीं लागू नहीं
पिछले एक संग्रह में मौजूद अंतिम तत्व या किसी विशिष्ट स्थिति को संतुष्ट करने वाला अंतिम तत्व प्राप्त करता है लागू नहीं लागू नहीं
LastOrDefault अंतिम के समान ही इस तथ्य को छोड़कर कि यह ऐसे किसी भी तत्व के अस्तित्व में नहीं होने की स्थिति में एक डिफ़ॉल्ट मान लौटाता है लागू नहीं लागू नहीं
एक एक संग्रह की अकेली तत्व या अकेला तत्व देता है जो एक निश्चित स्थिति को संतुष्ट करता है लागू नहीं लागू नहीं
SingleOrDefault सिंगल के रूप में भी सिवाय इसके कि यह एक डिफ़ॉल्ट मान भी लौटाता है अगर इस तरह के किसी भी अकेले तत्व का कोई अस्तित्व नहीं है लागू नहीं लागू नहीं
DefaultIfEmpty यदि संग्रह या सूची रिक्त है या रिक्त है, तो डिफ़ॉल्ट मान लौटाता है लागू नहीं लागू नहीं

LINQ to SQL ऑब्जेक्ट के रूप में रिलेशनल डेटा के प्रबंधन के लिए एक इंफ्रास्ट्रक्चर (रन-टाइम) प्रदान करता है। यह .NET फ्रेमवर्क के संस्करण 3.5 का एक घटक है और एब्सीडेंस ऑब्जेक्ट में भाषा-एकीकृत प्रश्नों का अनुवाद SQL में करता है। इन प्रश्नों को निष्पादन के उद्देश्य के लिए डेटाबेस में भेजा जाता है। डेटाबेस से परिणाम प्राप्त करने के बाद, LINQ से SQL फिर से वस्तुओं में अनुवाद करता है।

LINQ To SQL का परिचय

अधिकांश ASP.NET डेवलपर्स के लिए, LINQ to SQL (DLINQ के रूप में भी जाना जाता है) भाषा एकीकृत क्वेरी का एक विद्युतीकरण हिस्सा है क्योंकि यह सामान्य LINQ अभिव्यक्तियों का उपयोग करके SQL सर्वर डेटाबेस में डेटा को क्वेरी करने की अनुमति देता है। यह डेटा को अपडेट करने, हटाने और सम्मिलित करने की भी अनुमति देता है, लेकिन एकमात्र दोष जिससे यह ग्रस्त है वह SQL सर्वर डेटाबेस के लिए इसकी सीमा है। हालाँकि, ADO.NET पर LINQ से SQL में LINQ के कई फायदे हैं जैसे कि कम जटिलता, कोडिंग की कुछ लाइनें और बहुत कुछ।

नीचे एक आरेख है जो LINQ से SQL के निष्पादन वास्तुकला को दर्शाता है।

LINQ to SQL का उपयोग कैसे करें?

Step 1- डेटाबेस सर्वर के साथ एक नया "डेटा कनेक्शन" बनाएं। दृश्य और बन्दी; सर्वर एक्सप्लोरर और बन्दी; डेटा कनेक्शन और बन्दी; कनेक्शन जोड़ें

Step 2 - SQL वर्ग फ़ाइल में LINQ जोड़ें

Step 3 - डेटाबेस से तालिकाओं का चयन करें और नई LINQ में SQL क्लास फ़ाइल में खींचें और छोड़ें।

Step 4 - वर्ग फ़ाइल में जोड़े गए टेबल।

LINQ to SQL के साथ क्वेरी करना

LINQ to SQL के साथ किसी क्वेरी को निष्पादित करने के नियम मानक LINQ क्वेरी के समान है अर्थात क्वेरी को आस्थगित या तत्काल निष्पादित किया जाता है। लिनेक्यू के साथ क्वेरी के निष्पादन में भूमिका निभाने वाले विभिन्न घटक हैं जो एसक्यूएल के साथ हैं और ये निम्नलिखित हैं।

  • LINQ to SQL API - एक आवेदन की ओर से क्वेरी निष्पादन का अनुरोध करता है और इसे SQL प्रदाता को LINQ को भेज देता है।

  • LINQ to SQL Provider - क्वेरी को Transact SQL (T-SQL) में कनवर्ट करता है और ADO प्रोवाइडर को नई क्वेरी निष्पादन के लिए भेजता है।

  • ADO Provider - क्वेरी के निष्पादन के बाद, SQLR करने के लिए LINQ को DataReader के रूप में परिणाम भेजें जो बदले में इसे उपयोगकर्ता ऑब्जेक्ट के रूप में परिवर्तित करता है।

यह ध्यान दिया जाना चाहिए कि LINQ से SQL क्वेरी को निष्पादित करने से पहले डेटा स्रोत से डेटा स्रोत से कनेक्ट करना महत्वपूर्ण है।

LINQ To SQL का उपयोग करके डालें, अपडेट करें और डिलीट करें

जोड़ें या सम्मिलित करें

C#

using System;
using System.Linq;

namespace LINQtoSQL {
   class LinqToSQLCRUD {
      static void Main(string[] args) {
      
         string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();

         LinqToSQLDataContext db = new LinqToSQLDataContext(connectString);           

         //Create new Employee
		 
         Employee newEmployee = new Employee();
         newEmployee.Name = "Michael";
         newEmployee.Email = "[email protected]";
         newEmployee.ContactNo = "343434343";
         newEmployee.DepartmentId = 3;
         newEmployee.Address = "Michael - USA";

         //Add new Employee to database
         db.Employees.InsertOnSubmit(newEmployee);

         //Save changes to Database.
         db.SubmitChanges();

         //Get new Inserted Employee            
         Employee insertedEmployee = db.Employees.FirstOrDefault(e ⇒e.Name.Equals("Michael"));

         Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3}, Address = {4}",
                          insertedEmployee.EmployeeId, insertedEmployee.Name, insertedEmployee.Email, 
                          insertedEmployee.ContactNo, insertedEmployee.Address);

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Module Module1

   Sub Main()
   
      Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()

      Dim db As New LinqToSQLDataContext(connectString)

      Dim newEmployee As New Employee()
	  
      newEmployee.Name = "Michael"
      newEmployee.Email = "[email protected]"
      newEmployee.ContactNo = "343434343"
      newEmployee.DepartmentId = 3
      newEmployee.Address = "Michael - USA"
     
      db.Employees.InsertOnSubmit(newEmployee)
     
      db.SubmitChanges()
     
      Dim insertedEmployee As Employee = db.Employees.FirstOrDefault(Function(e) e.Name.Equals("Michael"))

      Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3}, 
         Address = {4}", insertedEmployee.EmployeeId, insertedEmployee.Name,
         insertedEmployee.Email, insertedEmployee.ContactNo, insertedEmployee.Address)

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()
	 
   End Sub
  
End Module

जब C # या VB के उपरोक्त कोड को संकलित और चलाया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

Emplyee ID = 4, Name = Michael, Email = [email protected], ContactNo = 
343434343, Address = Michael - USA

Press any key to continue.

अपडेट करें

C#

using System;
using System.Linq;

namespace LINQtoSQL {
   class LinqToSQLCRUD {
      static void Main(string[] args) {
      
         string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();

         LinqToSQLDataContext db = new LinqToSQLDataContext(connectString);

         //Get Employee for update
         Employee employee = db.Employees.FirstOrDefault(e =>e.Name.Equals("Michael"));

         employee.Name = "George Michael";
         employee.Email = "[email protected]";
         employee.ContactNo = "99999999";
         employee.DepartmentId = 2;
         employee.Address = "Michael George - UK";

         //Save changes to Database.
         db.SubmitChanges();

         //Get Updated Employee            
         Employee updatedEmployee = db.Employees.FirstOrDefault(e ⇒e.Name.Equals("George Michael"));

         Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3}, Address = {4}",
                          updatedEmployee.EmployeeId, updatedEmployee.Name, updatedEmployee.Email, 
                          updatedEmployee.ContactNo, updatedEmployee.Address);

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Module Module1

   Sub Main()
  
      Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()

      Dim db As New LinqToSQLDataContext(connectString)

      Dim employee As Employee = db.Employees.FirstOrDefault(Function(e) e.Name.Equals("Michael"))

      employee.Name = "George Michael"
      employee.Email = "[email protected]"
      employee.ContactNo = "99999999"
      employee.DepartmentId = 2
      employee.Address = "Michael George - UK"

      db.SubmitChanges()
          
      Dim updatedEmployee As Employee = db.Employees.FirstOrDefault(Function(e) e.Name.Equals("George Michael"))

      Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3},
         Address = {4}", updatedEmployee.EmployeeId, updatedEmployee.Name, 
         updatedEmployee.Email, updatedEmployee.ContactNo, updatedEmployee.Address)

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()
	  
   End Sub
   
End Module

जब C # या Vb के उपरोक्त कोड को संकलित और चलाया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

Emplyee ID = 4, Name = George Michael, Email = [email protected], ContactNo = 
999999999, Address = Michael George - UK

Press any key to continue.

हटाएं

C#

using System;
using System.Linq;

namespace LINQtoSQL {
   class LinqToSQLCRUD {
      static void Main(string[] args) {
      
         string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();

         LinqToSQLDataContext db = newLinqToSQLDataContext(connectString);

         //Get Employee to Delete
         Employee deleteEmployee = db.Employees.FirstOrDefault(e ⇒e.Name.Equals("George Michael"));

         //Delete Employee
         db.Employees.DeleteOnSubmit(deleteEmployee);

         //Save changes to Database.
         db.SubmitChanges();

         //Get All Employee from Database
         var employeeList = db.Employees;
         foreach (Employee employee in employeeList) {
            Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3}",
               employee.EmployeeId, employee.Name, employee.Email, employee.ContactNo);
         }            

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Module Module1

   Sub Main()
   
      Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()

      Dim db As New LinqToSQLDataContext(connectString)

      Dim deleteEmployee As Employee = db.Employees.FirstOrDefault(Function(e) e.Name.Equals("George Michael"))

      db.Employees.DeleteOnSubmit(deleteEmployee)

      db.SubmitChanges()

      Dim employeeList = db.Employees
	  
      For Each employee As Employee In employeeList
         Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3}",
            employee.EmployeeId, employee.Name, employee.Email, employee.ContactNo)
      Next 

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()
   End Sub
   
End Module

जब C # या VB के उपरोक्त कोड को संकलित और चलाया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

Emplyee ID = 1, Name = William, Email = [email protected], ContactNo = 999999999
Emplyee ID = 2, Name = Miley, Email = [email protected], ContactNo = 999999999
Emplyee ID = 3, Name = Benjamin, Email = [email protected], ContactNo = 

Press any key to continue.

LINQ से SQL या LINQ से XML में LINQ प्रोवाइडर (API) की आवश्यकता के बिना इन-मेमरी डेटा कलेक्शन तक पहुँचने के लिए LINQ से ऑब्जेक्ट्स LINQ क्वेरी का उपयोग IEnumerable <T> का समर्थन करता है।

LINQ का परिचय वस्तुओं से होता है

LINQ से ऑब्जेक्ट्स में क्वेरीज़ केवल आमतौर पर IEnumerable <T> प्रकार के चर वापस करती हैं। संक्षेप में, LINQ से ऑब्जेक्ट्स पहले के रूप में संग्रह के लिए एक नया दृष्टिकोण प्रदान करते हैं, संग्रह से डेटा की पुनर्प्राप्ति के लिए लंबी कोडिंग (बहुत जटिलता के फॉरेक्स लूप) लिखना महत्वपूर्ण था, जिसे अब घोषणात्मक कोड लिखकर बदल दिया गया है जो स्पष्ट रूप से वांछित डेटा का वर्णन करता है जिसे पुनः प्राप्त करना आवश्यक है।

पारंपरिक पठनीय छोरों से अधिक पठनीयता, शक्तिशाली फ़िल्टरिंग, समूहीकरण की क्षमता, न्यूनतम एप्लिकेशन कोडिंग के साथ उन्नत ऑर्डरिंग जैसी वस्तुओं के लिए LINQ के कई फायदे हैं। ऐसे LINQ क्वेरी प्रकृति में अधिक कॉम्पैक्ट हैं और किसी भी अन्य डेटा स्रोतों में बिना किसी संशोधन के या केवल थोड़े से संशोधन के साथ पोर्टेबल हैं।

नीचे वस्तुओं के उदाहरण के लिए एक सरल LINQ है -

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

namespace LINQtoObjects {
   class Program {
      static void Main(string[] args) {
      
         string[] tools = { "Tablesaw", "Bandsaw", "Planer", "Jointer", "Drill", "Sander" };
         var list = from t in tools select t;

         StringBuilder sb = new StringBuilder();

         foreach (string s in list) {
            sb.Append(s + Environment.NewLine);
         }
		 
         Console.WriteLine(sb.ToString(), "Tools");
         Console.ReadLine();
      }
   }
}

उदाहरण में, स्ट्रिंग के एक उपकरण (उपकरण) का उपयोग वस्तुओं के संग्रह के रूप में किया जाता है, जो कि LINQ का उपयोग करके वस्तुओं के लिए किया जाता है।

Objects query is:
var list = from t in tools select t;

जब उपरोक्त कोड संकलित और निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

Tablesaw
Bandsaw
Planer
Jointer
Drill
Sander

LINQ का उपयोग करके मेमोरी कलेक्शंस में क्वेरी करना

सी#

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

namespace LINQtoObjects {
   class Department {
      public int DepartmentId { get; set; }
      public string Name { get; set; }
   }

   class LinqToObjects {
      static void Main(string[] args) {
      
         List<Department> departments = new List<Department>();
			
         departments.Add(new Department { DepartmentId = 1, Name = "Account" });
         departments.Add(new Department { DepartmentId = 2, Name = "Sales" });
         departments.Add(new Department { DepartmentId = 3, Name = "Marketing" });

         var departmentList = from d in departments
                              select d;

         foreach (var dept in departmentList) {
            Console.WriteLine("Department Id = {0} , Department Name = {1}",
               dept.DepartmentId, dept.Name);
         }
		 
         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

वीबी

Imports System.Collections.Generic
Imports System.Linq

Module Module1

   Sub Main(ByVal args As String())

      Dim account As New Department With {.Name = "Account", .DepartmentId = 1}
      Dim sales As New Department With {.Name = "Sales", .DepartmentId = 2}
      Dim marketing As New Department With {.Name = "Marketing", .DepartmentId = 3}

      Dim departments As New System.Collections.Generic.List(Of Department)(New Department() {account, sales, marketing})

      Dim departmentList = From d In departments

      For Each dept In departmentList
         Console.WriteLine("Department Id = {0} , Department Name = {1}", dept.DepartmentId, dept.Name)
      Next

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()
   End Sub

   Class Department
      Public Property Name As String
      Public Property DepartmentId As Integer
   End Class
   
End Module

जब C # या VB के उपरोक्त कोड को संकलित और निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

Department Id = 1, Department Name = Account
Department Id = 2, Department Name = Sales
Department Id = 3, Department Name = Marketing

Press any key to continue.

डेटासैट मेमोरी में एक अत्यंत उपयोगी डेटा प्रतिनिधित्व प्रदान करता है और इसका उपयोग विभिन्न डेटा आधारित अनुप्रयोगों के लिए किया जाता है। LINQ to Dataset में से एक के रूप में LINQ से ADO.NET की तकनीक एक डेटासेट के डेटा पर परेशानी मुक्त तरीके से क्वेरी करने की सुविधा प्रदान करती है और उत्पादकता को बढ़ाती है।

LINQ To Dataset का परिचय

LINQ to Dataset ने डेवलपर्स के लिए क्वेरी को सरल बनाने का काम किया है। उन्हें एक विशिष्ट क्वेरी भाषा में प्रश्नों को लिखने की आवश्यकता नहीं है, बल्कि प्रोग्रामिंग भाषा में लिखा जा सकता है। LINQ से डेटासेट क्वेरी के लिए भी उपयोगी है जहाँ डेटा को कई डेटा स्रोतों से समेकित किया जाता है। मेमोरी कलेक्शन से डेटा एक्सेस करने के लिए भी LINQ से SQL और LINQ से XML की तरह किसी LINQ प्रदाता की आवश्यकता नहीं है।

नीचे डेटासेट क्वेरी के लिए एक LINQ का एक सरल उदाहरण है जिसमें एक डेटा स्रोत पहले प्राप्त किया जाता है और फिर डेटासेट दो डेटा तालिकाओं से भर जाता है। दोनों तालिकाओं के बीच एक संबंध स्थापित किया जाता है और एक खंड के रूप में दोनों तालिकाओं के खिलाफ एक LINQ क्वेरी बनाई जाती है। अंत में, वांछित परिणाम प्रदर्शित करने के लिए foreach loop का उपयोग किया जाता है।

सी#

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LINQtoDataset {
   class Program {
      static void Main(string[] args) {
      
         string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();

         string sqlSelect = "SELECT * FROM Department;" + "SELECT * FROM Employee;";

         // Create the data adapter to retrieve data from the database
         SqlDataAdapter da = new SqlDataAdapter(sqlSelect, connectString);
        
         // Create table mappings
         da.TableMappings.Add("Table", "Department");
         da.TableMappings.Add("Table1", "Employee");

         // Create and fill the DataSet
         DataSet ds = new DataSet();
         da.Fill(ds);

         DataRelation dr = ds.Relations.Add("FK_Employee_Department",
                           ds.Tables["Department"].Columns["DepartmentId"],
                           ds.Tables["Employee"].Columns["DepartmentId"]);

         DataTable department = ds.Tables["Department"];
         DataTable employee = ds.Tables["Employee"];

         var query = from d in department.AsEnumerable()
                     join e in employee.AsEnumerable()
                     on d.Field<int>("DepartmentId") equals
                     e.Field<int>("DepartmentId")                        
                     select new {
                        EmployeeId = e.Field<int>("EmployeeId"),
                        Name = e.Field<string>("Name"),                            
                        DepartmentId = d.Field<int>("DepartmentId"),                            
                        DepartmentName = d.Field<string>("Name")
                     };

         foreach (var q in query) {
            Console.WriteLine("Employee Id = {0} , Name = {1} , Department Name = {2}",
               q.EmployeeId, q.Name, q.DepartmentName);
         }

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

वीबी

Imports System.Data.SqlClient
Imports System.Linq

Module LinqToDataSet

   Sub Main()
   
      Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()

      Dim sqlSelect As String = "SELECT * FROM Department;" + "SELECT * FROM Employee;"
      Dim sqlCnn As SqlConnection = New SqlConnection(connectString)
      sqlCnn.Open()

      Dim da As New SqlDataAdapter
      da.SelectCommand = New SqlCommand(sqlSelect, sqlCnn)

      da.TableMappings.Add("Table", "Department")
      da.TableMappings.Add("Table1", "Employee")

      Dim ds As New DataSet()
      da.Fill(ds)

      Dim dr As DataRelation = ds.Relations.Add("FK_Employee_Department", ds.Tables("Department").Columns("DepartmentId"), ds.Tables("Employee").Columns("DepartmentId"))

      Dim department As DataTable = ds.Tables("Department")
      Dim employee As DataTable = ds.Tables("Employee")

      Dim query = From d In department.AsEnumerable()
                  Join e In employee.AsEnumerable() On d.Field(Of Integer)("DepartmentId") Equals
                  e.Field(Of Integer)("DepartmentId")
                  Select New Person With { _
                        .EmployeeId = e.Field(Of Integer)("EmployeeId"),
                        .EmployeeName = e.Field(Of String)("Name"),
                        .DepartmentId = d.Field(Of Integer)("DepartmentId"),
                        .DepartmentName = d.Field(Of String)("Name")
                  }

      For Each e In query
         Console.WriteLine("Employee Id = {0} , Name = {1} , Department Name = {2}", e.EmployeeId, e.EmployeeName, e.DepartmentName)
      Next

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()
	  
   End Sub
  
   Class Person
      Public Property EmployeeId As Integer
      Public Property EmployeeName As String
      Public Property DepartmentId As Integer
      Public Property DepartmentName As String
   End Class
   
End Module

जब C # या VB के उपरोक्त कोड को संकलित और निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

Employee Id = 1, Name = William, Department Name = Account
Employee Id = 2, Name = Benjamin, Department Name = Account
Employee Id = 3, Name = Miley, Department Name = Sales

Press any key to continue.

Dataset को LinQ का उपयोग करके डेटासेट क्वेरी करना

डेटासेट में LINQ का उपयोग करके डेटासेट की क्वेरी करने से पहले डेटा को डेटासेट में लोड करना महत्वपूर्ण है और यह DataAdapter वर्ग या LINQ से SQL का उपयोग करके किया जाता है। LINQ से डेटासेट में LINQ का उपयोग करके प्रश्नों का निरूपण, अन्य LINQ सक्षम डेटा स्रोतों के साथ LINQ का उपयोग करके प्रश्नों को तैयार करने के समान है।

एकल-तालिका क्वेरी

निम्न एकल-तालिका क्वेरी में, सभी ऑनलाइन ऑर्डर SalesOrderHeaderTtable से एकत्र किए जाते हैं और फिर ऑर्डर आईडी, ऑर्डर तिथि के साथ-साथ ऑर्डर संख्या को आउटपुट के रूप में प्रदर्शित किया जाता है।

C#

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LinqToDataset {
   class SingleTable {
      static void Main(string[] args) {
      
         string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();

         string sqlSelect = "SELECT * FROM Department;";

         // Create the data adapter to retrieve data from the database
         SqlDataAdapter da = new SqlDataAdapter(sqlSelect, connectString);

         // Create table mappings
         da.TableMappings.Add("Table", "Department");           

         // Create and fill the DataSet
         DataSet ds = new DataSet();
         da.Fill(ds);

         DataTable department = ds.Tables["Department"];            

         var query = from d in department.AsEnumerable()                        
         select new {
            DepartmentId = d.Field<int>("DepartmentId"),
            DepartmentName = d.Field<string>("Name")
         };

         foreach (var q in query) {
            Console.WriteLine("Department Id = {0} , Name = {1}",
               q.DepartmentId, q.DepartmentName);
         }

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Imports System.Data.SqlClient
Imports System.Linq

Module LinqToDataSet

   Sub Main()
   
      Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()

      Dim sqlSelect As String = "SELECT * FROM Department;"
      Dim sqlCnn As SqlConnection = New SqlConnection(connectString)
      sqlCnn.Open()

      Dim da As New SqlDataAdapter
      da.SelectCommand = New SqlCommand(sqlSelect, sqlCnn)

      da.TableMappings.Add("Table", "Department")
      Dim ds As New DataSet()
      da.Fill(ds)

      Dim department As DataTable = ds.Tables("Department")

      Dim query = From d In department.AsEnumerable()
      Select New DepartmentDetail With {
         .DepartmentId = d.Field(Of Integer)("DepartmentId"),
            .DepartmentName = d.Field(Of String)("Name")
      }

      For Each e In query
         Console.WriteLine("Department Id = {0} , Name = {1}", e.DepartmentId, e.DepartmentName)
      Next

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()
   End Sub

   Public Class DepartmentDetail
      Public Property DepartmentId As Integer
      Public Property DepartmentName As String
   End Class
   
End Module

जब C # या VB के उपरोक्त कोड को संकलित और निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

Department Id = 1, Name = Account
Department Id = 2, Name = Sales
Department Id = 3, Name = Pre-Sales
Department Id = 4, Name = Marketing

Press any key to continue.

LINQ to XML मानक लाइन ऑपरेटर्स, प्रोग्रामिंग इंटरफ़ेस आदि जैसे सभी LINQ कार्यप्रणालियों के लिए आसान पहुँच प्रदान करता है। .NET फ्रेमवर्क में एकीकृत, LINQ to XML भी .NET फ्रेमवर्क फ़ंक्शंस का सबसे अच्छा उपयोग करता है जैसे डीबगिंग, संकलन-समय जाँच, मजबूत टाइपिंग और भी बहुत कुछ कहना है।

LINQ to XML का परिचय

LINQ to XML का उपयोग करते समय, XML दस्तावेज़ को मेमोरी में लोड करना आसान है और अधिक आसान है क्वेरी और दस्तावेज़ संशोधन। स्मृति में विद्यमान XML दस्तावेज़ों को डिस्क में सहेजना और उन्हें क्रमबद्ध करना भी संभव है। यह XML क्वेरी भाषा को सीखने के लिए डेवलपर की आवश्यकता को समाप्त करता है जो कि कुछ जटिल है।

LINQ to XML के पास System.Xml.inq नाम स्थान में अपनी शक्ति है। इसमें XML के साथ काम करने के लिए सभी 19 आवश्यक कक्षाएं हैं। ये वर्ग निम्नलिखित हैं।

  • XAttribute
  • XCData
  • XComment
  • XContainer
  • XDeclaration
  • XDocument
  • XDocumentType
  • XElement
  • XName
  • XNamespace
  • XNode
  • XNodeDocumentOrderComparer
  • XNodeEqualityComparer
  • XObject
  • XObjectChange
  • XObjectChangeEventArgs
  • XObjectEventHandler
  • XProcessingInstruction
  • XText

LINQ का उपयोग कर एक XML फ़ाइल पढ़ें

सी#

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

namespace LINQtoXML {
   class ExampleOfXML {
      static void Main(string[] args) {
      
         string myXML = @"<Departments>
                       <Department>Account</Department>
                       <Department>Sales</Department>
                       <Department>Pre-Sales</Department>
                       <Department>Marketing</Department>
                       </Departments>";

         XDocument xdoc = new XDocument();
         xdoc = XDocument.Parse(myXML);

         var result = xdoc.Element("Departments").Descendants();

         foreach (XElement item in result) {
            Console.WriteLine("Department Name - " + item.Value);
         }

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

वीबी

Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml.Linq

Module Module1

   Sub Main(ByVal args As String())
   
      Dim myXML As String = "<Departments>" & vbCr & vbLf & 
                           "<Department>Account</Department>" & vbCr & vbLf & 
                           "<Department>Sales</Department>" & vbCr & vbLf & 
                           "<Department>Pre-Sales</Department>" & vbCr & vbLf & 
                           "<Department>Marketing</Department>" & vbCr & vbLf & 
                           "</Departments>"

      Dim xdoc As New XDocument()
      xdoc = XDocument.Parse(myXML)

      Dim result = xdoc.Element("Departments").Descendants()

      For Each item As XElement In result
         Console.WriteLine("Department Name - " + item.Value)
      Next

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()
	  
   End Sub
   
End Module

जब C # या VB के उपरोक्त कोड को संकलित और निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

Department Name - Account
Department Name - Sales
Department Name - Pre-Sales
Department Name - Marketing

Press any key to continue.

नया नोड जोड़ें

सी#

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

namespace LINQtoXML {
   class ExampleOfXML {
      static void Main(string[] args) {
      
         string myXML = @"<Departments>
                       <Department>Account</Department>
                       <Department>Sales</Department>
                       <Department>Pre-Sales</Department>
                       <Department>Marketing</Department>
                       </Departments>";

         XDocument xdoc = new XDocument();
         xdoc = XDocument.Parse(myXML);

         //Add new Element
         xdoc.Element("Departments").Add(new XElement("Department", "Finance"));

         //Add new Element at First
         xdoc.Element("Departments").AddFirst(new XElement("Department", "Support"));

         var result = xdoc.Element("Departments").Descendants();

         foreach (XElement item in result) {
            Console.WriteLine("Department Name - " + item.Value);
         }

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

वीबी

Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml.Linq

Module Module1

   Sub Main(ByVal args As String())
   
      Dim myXML As String = "<Departments>" & vbCr & vbLf & 
     	                   "<Department>Account</Department>" & vbCr & vbLf & 
     	                   "<Department>Sales</Department>" & vbCr & vbLf & 
     	                   "<Department>Pre-Sales</Department>" & vbCr & vbLf & 
     	                   "<Department>Marketing</Department>" & vbCr & vbLf & 
     	                   "</Departments>"

      Dim xdoc As New XDocument()
      xdoc = XDocument.Parse(myXML)

      xdoc.Element("Departments").Add(New XElement("Department", "Finance"))
     
      xdoc.Element("Departments").AddFirst(New XElement("Department", "Support"))

      Dim result = xdoc.Element("Departments").Descendants()

      For Each item As XElement In result
         Console.WriteLine("Department Name - " + item.Value)
      Next

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()
	  
   End Sub
   
End Module

जब C # या VB के उपरोक्त कोड को संकलित और निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

Department Name - Support
Department Name - Account
Department Name - Sales
Department Name - Pre-Sales
Department Name - Marketing
Department Name - Finance

Press any key to continue.

विशेष रूप से नोड को हटाना

सी#

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

namespace LINQtoXML {
   class ExampleOfXML {
      static void Main(string[] args) {
      
         string myXML = @"<Departments>
                       <Department>Support</Department>
                       <Department>Account</Department>
                       <Department>Sales</Department>
                       <Department>Pre-Sales</Department>
                       <Department>Marketing</Department>
                       <Department>Finance</Department>
                       </Departments>";

         XDocument xdoc = new XDocument();
         xdoc = XDocument.Parse(myXML);

         //Remove Sales Department
         xdoc.Descendants().Where(s =>s.Value == "Sales").Remove(); 

         var result = xdoc.Element("Departments").Descendants();

         foreach (XElement item in result) {
            Console.WriteLine("Department Name - " + item.Value);
         }

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

वीबी

Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml.Linq

Module Module1

   Sub Main(args As String())
   
      Dim myXML As String = "<Departments>" & vbCr & vbLf & 
     	                   "<Department>Support</Department>" & vbCr & vbLf & 
     	                   "<Department>Account</Department>" & vbCr & vbLf & 
     	                   "<Department>Sales</Department>" & vbCr & vbLf & 
     	                   "<Department>Pre-Sales</Department>" & vbCr & vbLf & 
     	                   "<Department>Marketing</Department>" & vbCr & vbLf & 
     	                   "<Department>Finance</Department>" & vbCr & vbLf & 
                           "</Departments>"

      Dim xdoc As New XDocument()
      xdoc = XDocument.Parse(myXML)
     
      xdoc.Descendants().Where(Function(s) s.Value = "Sales").Remove()

      Dim result = xdoc.Element("Departments").Descendants()

      For Each item As XElement In result
         Console.WriteLine("Department Name - " + item.Value)
      Next

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()
	  
   End Sub
   
End Module

जब C # या VB के उपरोक्त कोड को संकलित और निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

Department Name - Support
Department Name - Account
Department Name - Pre-Sales
Department Name - Marketing
Department Name - Finance

Press any key to continue.

ADO.NET एंटिटी फ्रेमवर्क का एक हिस्सा, LINQ to Entities, LINQ से SQL की तुलना में अधिक लचीला है, लेकिन इसकी जटिलता और प्रमुख विशेषताओं की कमी के कारण ज्यादा लोकप्रिय नहीं है। हालाँकि, इसमें LINQ से SQL तक की सीमाएँ नहीं हैं जो केवल SQL सर्वर डेटाबेस में डेटा क्वेरी की अनुमति देता है क्योंकि LINQ to Entities बड़ी संख्या में डेटा प्रदाताओं जैसे Oracle, MySQL आदि में डेटा क्वेरी की सुविधा देता है।

इसके अलावा, इसे ASP.Net से इस अर्थ में एक बड़ा समर्थन मिला है कि उपयोगकर्ता LINQ से Entities के माध्यम से एक क्वेरी निष्पादित करने के लिए डेटा स्रोत नियंत्रण का उपयोग कर सकते हैं और अतिरिक्त कोडिंग की आवश्यकता के बिना परिणामों के बंधन की सुविधा प्रदान करते हैं।

LINQ to Entities इन फायदों के लिए आजकल डेटाबेस पर LINQ के उपयोग के लिए मानक तंत्र बन गया है। LINQ Entities के साथ queried डाटा डिटेल्स को बदलना और बैच अपडेट को आसानी से कमिट करना भी संभव है। LINQ to Entities के बारे में सबसे पेचीदा तथ्य यह है कि इसमें SQL की तरह ही सिंटैक्स होता है और यहाँ तक कि मानक क्वेरी ऑपरेटर्स जैसे Join, Select, OrderBy इत्यादि का भी समूह होता है।

LINQ to Entities प्रश्न निर्माण और निष्पादन प्रक्रिया

  • ए का निर्माण ObjectQuery उदाहरण से बाहर ObjectContext (इकाई कनेक्शन)

  • नवनिर्मित उदाहरण का उपयोग करके C # या Visual Basic (VB) में क्वेरी लिखना

  • LINQ के मानक क्वेरी ऑपरेटरों के साथ-साथ LINQ अभिव्यक्तियों को कमांड ट्री में बदलना

  • सीधे ग्राहक के सामने आए किसी भी अपवाद को पारित करने वाले क्वेरी को निष्पादित करना

  • सभी क्वेरी परिणामों के लिए क्लाइंट पर लौटना

ObjectContext यहाँ प्राथमिक वर्ग है जो बातचीत को सक्षम बनाता है Entity Data Modelया दूसरे शब्दों में एक पुल के रूप में कार्य करता है जो LINQ को डेटाबेस से जोड़ता है। कमांड ट्री यहां एंटिटी फ्रेमवर्क के साथ संगतता के साथ क्वेरी प्रतिनिधित्व हैं।

दूसरी ओर, एंटिटी फ्रेमवर्क, वास्तव में है Object Relational Mapperआमतौर पर डेवलपर्स द्वारा ORM के रूप में संक्षिप्त किया जाता है जो व्यावसायिक वस्तुओं की पीढ़ी के साथ-साथ डेटाबेस तालिकाओं के अनुसार भी बनाता है और विभिन्न बुनियादी कार्यों जैसे बनाने, अपडेट करने, हटाने और पढ़ने की सुविधा प्रदान करता है। निम्नलिखित दृष्टांत इकाई की रूपरेखा और उसके घटकों को दर्शाता है।

ADD, UPDATE, और DELETE का उदाहरण इकाई मॉडल के साथ LINQ का उपयोग करना

नीचे दिए गए चरणों का पालन करके पहले इकाई मॉडल जोड़ें।

Step 1- प्रोजेक्ट पर राइट क्लिक करें और Add new आइटम पर क्लिक करें नीचे के अनुसार विंडो खुल जाएगी। ADO.NET इकाई डेटा मॉडल का चयन करें और नाम निर्दिष्ट करें और Add पर क्लिक करें।

Step 2 - चयन करें Generate from database.

Step 3 - ड्रॉप-डाउन मेनू से डेटाबेस कनेक्शन चुनें।

Step 4 - सभी तालिकाओं का चयन करें।

अब निम्नलिखित कोड लिखें।

using DataAccess;
using System;
using System.Linq;

namespace LINQTOSQLConsoleApp {
   public class LinqToEntityModel {
      static void Main(string[] args) {

         using (LinqToSQLDBEntities context = new LinqToSQLDBEntities()) {
            //Get the List of Departments from Database
            var departmentList = from d in context.Departments
            select d;

            foreach (var dept in departmentList) {
               Console.WriteLine("Department Id = {0} , Department Name = {1}",
                  dept.DepartmentId, dept.Name);
            }

            //Add new Department
            DataAccess.Department department = new DataAccess.Department();
            department.Name = "Support";

            context.Departments.Add(department);
            context.SaveChanges();

            Console.WriteLine("Department Name = Support is inserted in Database");

            //Update existing Department
            DataAccess.Department updateDepartment = context.Departments.FirstOrDefault(d ⇒d.DepartmentId == 1);
            updateDepartment.Name = "Account updated";
            context.SaveChanges();

            Console.WriteLine("Department Name = Account is updated in Database");

            //Delete existing Department
            DataAccess.Department deleteDepartment = context.Departments.FirstOrDefault(d ⇒d.DepartmentId == 3);
            context.Departments.Remove(deleteDepartment);
            context.SaveChanges();

            Console.WriteLine("Department Name = Pre-Sales is deleted in Database");

            //Get the Updated List of Departments from Database
            departmentList = from d in context.Departments
            select d;

            foreach (var dept in departmentList) {
               Console.WriteLine("Department Id = {0} , Department Name = {1}",
                  dept.DepartmentId, dept.Name);
            }
         }

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

जब उपरोक्त कोड संकलित और निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

'लैंबडा एक्सप्रेशन' शब्द का नाम 'लैम्ब्डा' कैलकुलस से लिया गया है, जो बदले में एक गणितीय अंकन है जिसे परिभाषित कार्यों के लिए लागू किया जाता है। LINQ समीकरण के निष्पादन योग्य भाग के रूप में लैम्ब्डा एक्सप्रेशंस रन टाइम में एक तरह से लॉजिक ट्रांसलेट करता है ताकि यह डेटा स्रोत पर आसानी से पास हो सके। हालाँकि, lambda अभिव्यक्तियाँ केवल LINQ में आवेदन खोजने के लिए सीमित नहीं हैं।

ये भाव निम्नलिखित वाक्य विन्यास द्वारा व्यक्त किए गए हैं -

(Input parameters) ⇒ Expression or statement block

यहाँ एक लंबोदर अभिव्यक्ति का एक उदाहरण है -

y ⇒ y * y

उपरोक्त अभिव्यक्ति y नाम के पैरामीटर को निर्दिष्ट करती है और y का मान चुकता है। हालांकि, इस रूप में एक लंबोदर अभिव्यक्ति को निष्पादित करना संभव नहीं है। C # में लैम्बडा एक्सप्रेशन का उदाहरण नीचे दिखाया गया है।

सी#

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

namespace lambdaexample {
   class Program {

      delegate int del(int i);
      static void Main(string[] args) {

         del myDelegate = y ⇒ y * y;
         int j = myDelegate(5);
         Console.WriteLine(j);
         Console.ReadLine();
      }
   }
}

वीबी

Module Module1
   Private Delegate Function del(ByVal i As Integer) As Integer
   
   Sub Main(ByVal args As String())
   
      Dim myDelegate As del = Function(y) y * y
      Dim j As Integer = myDelegate(5)
      Console.WriteLine(j)
      Console.ReadLine()
	  
   End Sub
   
End Module

जब C # या VB के उपरोक्त कोड को संकलित और निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

25

अभिव्यक्ति लाम्बा

जैसा कि ऊपर दिखाया गया लैम्ब्डा अभिव्यक्ति के वाक्य विन्यास में अभिव्यक्ति दाहिने हाथ की तरफ है, इन्हें एक्सप्रेशन लैम्ब्डा के रूप में भी जाना जाता है।

Async लाम्बास

Async कीवर्ड के उपयोग द्वारा अतुल्यकालिक प्रसंस्करण को शामिल करके बनाई गई लैम्ब्डा अभिव्यक्ति को async lambdas के रूप में जाना जाता है। नीचे async lambda का उदाहरण दिया गया है।

Func<Task<string>> getWordAsync = async()⇒ “hello”;

मानक क्वेरी ऑपरेटरों में लैम्ब्डा

एक क्वेरी ऑपरेटर के भीतर एक लैम्ब्डा अभिव्यक्ति का मूल्यांकन मांग पर एक ही द्वारा किया जाता है और इनपुट अनुक्रम में प्रत्येक तत्व पर लगातार काम करता है और पूरे अनुक्रम में नहीं। डेवलपर्स को मानक क्वेरी ऑपरेटरों में अपने स्वयं के तर्क को खिलाने के लिए लैंबडा अभिव्यक्ति द्वारा अनुमति दी जाती है। नीचे दिए गए उदाहरण में, डेवलपर ने लैम्ब्डा अभिव्यक्ति का उपयोग करके दिए गए सूची से विषम मूल्यों को पुनः प्राप्त करने के लिए 'व्हेयर' ऑपरेटर का उपयोग किया है।

सी#

//Get the average of the odd Fibonacci numbers in the series... 

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

namespace lambdaexample {
   class Program {     
      static void Main(string[] args) {
      
         int[] fibNum = { 1, 1, 2, 3, 5, 8, 13, 21, 34 };
         double averageValue = fibNum.Where(num ⇒ num % 2 == 1).Average();
         Console.WriteLine(averageValue);
         Console.ReadLine();
      }
   }
}

वीबी

Module Module1

   Sub Main()
   
      Dim fibNum As Integer() = {1, 1, 2, 3, 5, 8, 13, 21, 34}
      Dim averageValue As Double = fibNum.Where(Function(num) num Mod 2 = 1).Average()
	  
      Console.WriteLine(averageValue)
      Console.ReadLine()
	  
   End Sub
   
End Module

जब उपरोक्त कोड संकलित और निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

7.33333333333333

लैंबडा में टाइप इंट्रेंस

C # में, विभिन्न प्रकार की स्थितियों में प्रकार का अनुमान आसानी से उपयोग किया जाता है और वह भी स्पष्ट रूप से प्रकारों को निर्दिष्ट किए बिना। हालाँकि एक लंबोदर अभिव्यक्ति के मामले में, प्रकार का अनुमान तभी काम करेगा जब प्रत्येक प्रकार को निर्दिष्ट किया गया हो क्योंकि कंपाइलर को संतुष्ट होना चाहिए। आइए निम्नलिखित उदाहरण पर विचार करें।

delegate int Transformer (int i);

यहाँ कंपाइलर इस तथ्य पर आकर्षित करने के लिए टाइप इंफ़ेक्शन लगाता है कि x एक पूर्णांक है और यह ट्रांसफार्मर के पैरामीटर प्रकार की जाँच करके किया जाता है।

लैम्ब्डा एक्सप्रेशन में वेरिएबल स्कोप

लैंबडा एक्सप्रेशन में वेरिएबल स्कोप का उपयोग करते समय कुछ नियम होते हैं जैसे लैम्बडा एक्सप्रेशन के भीतर शुरू होने वाले वैरिएबल का मतलब किसी बाहरी तरीके से दिखना नहीं है। एक नियम यह भी है कि एक कैप्चर किए गए वेरिएबल को तब तक कचरा एकत्र नहीं करना है, जब तक कि उसे संदर्भित प्रतिनिधि कचरा संग्रहण के कार्य के लिए पात्र न हो जाए। इसके अलावा, एक नियम है जो एक लंबोदर अभिव्यक्ति के भीतर एक वापसी कथन को प्रतिबंधित करता है जिससे एक संलग्न पद्धति की वापसी होती है।

यहाँ लैम्बडा एक्सप्रेशन में वेरिएबल स्कोप को प्रदर्शित करने के लिए एक उदाहरण दिया गया है।

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

namespace lambdaexample {
   class Program {
      delegate bool D();
      delegate bool D2(int i);

      class Test {
         D del;
         D2 del2;
			
         public void TestMethod(int input) {
            int j = 0;
            // Initialize the delegates with lambda expressions.
            // Note access to 2 outer variables.
            // del will be invoked within this method.
            del = () ⇒ { j = 10; return j > input; };

            // del2 will be invoked after TestMethod goes out of scope.
            del2 = (x) ⇒ { return x == j; };

            // Demonstrate value of j:            
            // The delegate has not been invoked yet.
            Console.WriteLine("j = {0}", j);        // Invoke the delegate.
            bool boolResult = del();
           
            Console.WriteLine("j = {0}. b = {1}", j, boolResult);
         }

         static void Main() {
            Test test = new Test();
            test.TestMethod(5);

            // Prove that del2 still has a copy of
            // local variable j from TestMethod.
            bool result = test.del2(10);
           
            Console.WriteLine(result);

            Console.ReadKey();
         }
      }
   }
}

जब उपरोक्त कोड संकलित और निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

j = 0
j = 10. b = True
True

अभिव्यक्ति का पेड़

में लैंबडा भाव का प्रयोग किया जाता है Expression Treeबड़े पैमाने पर निर्माण। एक अभिव्यक्ति ट्री एक डेटा संरचना में एक पेड़ से मिलता-जुलता कोड देता है जिसमें प्रत्येक नोड अपने आप में एक मेथड कॉल की तरह एक अभिव्यक्ति है या x <y जैसे बाइनरी ऑपरेशन हो सकता है। नीचे एक अभिव्यक्ति पेड़ के निर्माण के लिए लंबोदर अभिव्यक्ति के उपयोग का एक उदाहरण है।

कथन लम्बदा

वहाँ भी statement lambdasदो या तीन बयानों से मिलकर, लेकिन अभिव्यक्ति पेड़ों के निर्माण में उपयोग नहीं किया जाता है। रिटर्न स्टेटमेंट एक स्टेटमेंट में लिखा जाना चाहिए।

कथन lambda का सिंटेक्स

(params)⇒ {statements}

एक कथन लंबोदर का उदाहरण

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;

namespace lambdaexample {
   class Program {
      static void Main(string[] args) {
         int[] source = new[] { 3, 8, 4, 6, 1, 7, 9, 2, 4, 8 };

         foreach (int i in source.Where(x ⇒ 
            {
               if (x <= 3)
                  return true;
               else if (x >= 7)
                  return true;
               return false;
            }
         ))
        Console.WriteLine(i);
        Console.ReadLine();
      }
   }
}

जब उपरोक्त कोड संकलित और निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

3
8
1
7
9
2
8

Lambdas LINQ प्रश्नों में तर्कों के रूप में नियोजित हैं और कभी भी इसके संचालकों के बाईं ओर एक स्थान रखने की अनुमति नहीं है is या asअनाम तरीकों की तरह। हालांकि, लैंबडा अभिव्यक्ति बहुत समान रूप से गुमनाम तरीके हैं, ये केवल प्रतिनिधियों के रूप में उपयोग करने के लिए प्रतिबंधित नहीं हैं।

लंबोदर भावों का उपयोग करते समय याद रखने वाले बिंदु

  • एक लैम्ब्डा अभिव्यक्ति एक मूल्य वापस कर सकती है और इसमें पैरामीटर हो सकते हैं।

  • पैरामीटर को मेमने की अभिव्यक्ति के साथ असंख्य तरीकों से परिभाषित किया जा सकता है।

  • यदि एक लंबोदर अभिव्यक्ति में एकल कथन है, तो घुंघराले कोष्ठक की आवश्यकता नहीं है, जबकि यदि कई कथन हैं, तो घुंघराले कोष्ठक के साथ-साथ वापसी मूल्य भी लिखना आवश्यक है।

  • लैम्ब्डा एक्सप्रेशन के साथ, लैम्बडा एक्सप्रेशन ब्लॉक के बाहर मौजूद वैरिएबल्स को क्लोजर के रूप में जाना जाता है। किसी भी समस्या से बचने के लिए बंद का उपयोग सावधानी से किया जाना चाहिए।

  • किसी भी लैम्ब्डा अभिव्यक्ति के अंदर किसी भी असुरक्षित कोड को निष्पादित करना असंभव है।

  • लैम्ब्डा भाव ऑपरेटर के बाईं ओर उपयोग करने के लिए नहीं हैं।

.NET फ्रेमवर्क एक्सटेंशन के एक सेट के रूप में, LINQ ASP.NET डेवलपर्स द्वारा डेटा एक्सेस के लिए पसंदीदा तंत्र है। ASP.NET 3.5 में एक अंतर्निहित टूल LINQDataSource नियंत्रण है जो ASP.NET में LINQ के उपयोग को आसानी से सक्षम करता है। ASP.NET डेटा स्रोत के रूप में उपर्युक्त नियंत्रण का उपयोग करता है। वास्तविक जीवन की परियोजनाएं ज्यादातर वेबसाइटों या विंडोज़ अनुप्रयोगों को शामिल करती हैं और इसलिए ASP.NET के साथ LINQ की अवधारणा को बेहतर ढंग से समझने के लिए, चलो ASP.NET वेबसाइट बनाने के साथ शुरू करें जो LINQ सुविधाओं का उपयोग करें।

इसके लिए, आपके सिस्टम पर विजुअल स्टूडियो और .NET फ्रेमवर्क स्थापित करना आवश्यक है। एक बार जब आप विजुअल स्टूडियो खोल लेते हैं, तो फाइल → न्यू → वेबसाइट पर जाएं। एक पॉप अप विंडो खुलेगी जैसा कि नीचे दिए गए चित्र में दिखाया गया है।

अब, बाएं हाथ की ओर टेम्पलेट के तहत, वेबसाइट बनाने के लिए दो भाषा विकल्प होंगे। चुनेंVisual C# और चुनें ASP.NET Empty Web Site

उस फ़ोल्डर का चयन करें जहाँ आप अपने सिस्टम पर नई वेबसाइट को सहेजना चाहते हैं। फिर दबायेंOK और इसी तरह Solution Explorerआपकी स्क्रीन पर सभी वेब फ़ाइलें होती हैं। समाधान एक्सप्लोरर में Default.aspx पर राइट क्लिक करें और ब्राउज़र में डिफ़ॉल्ट ASP.NET वेबसाइट देखने के लिए ब्राउज़र में दृश्य चुनें। जल्द ही आपकी नई ASP.NET वेबसाइट वेब ब्राउज़र में खुल जाएगी, जैसा कि निम्नलिखित स्क्रीनशॉट में दिखाया गया है।

.aspx वास्तव में ASP.NET वेबसाइटों में उपयोग की जाने वाली प्रमुख फाइल एक्सटेंशन है। डिफ़ॉल्ट रूप से Visual Studio मूल वेबसाइट की तरह सभी आवश्यक पृष्ठ बनाता हैHome page तथा About Usवह पृष्ठ जहाँ आप अपनी सामग्री आसानी से रख सकते हैं। वेबसाइट के लिए कोड स्वचालित रूप से यहां उत्पन्न होता है और इसे देखा भी जा सकता है।

LINQDataSource नियंत्रण

यह संभव है कि UPDATE, INSERT तथा DELETELINQDataSource नियंत्रण की सहायता से ASP.NET वेबसाइट के पृष्ठों में डेटा। SQL कमांड के विनिर्देशन की कोई आवश्यकता नहीं है क्योंकि LINQDataSource नियंत्रण ऐसे कार्यों के लिए गतिशील रूप से निर्मित कमांड को नियोजित करता है।

नियंत्रण मार्कअप पाठ में संपत्ति सेटिंग द्वारा एक ASP.NET वेब पेज में LINQ का उपयोग करने के लिए उपयोगकर्ता को सक्षम बनाता है। LINQDataSource जैसे नियंत्रण के बहुत समान हैSqlDataSource साथ ही साथ ObjectDataSourceक्योंकि इसका उपयोग पृष्ठ पर मौजूद अन्य ASP.NET नियंत्रणों को डेटा स्रोत में बाँधने में किया जा सकता है। तो, हमारे पास होना चाहिएdatabase LINQDataSource नियंत्रण द्वारा लागू किए गए विभिन्न कार्यों को समझाने के लिए।

ASP.NET वेब पेज फॉर्म में नियंत्रण उपयोग की व्याख्या शुरू करने से पहले, Microsoft Visual Studio टूलबॉक्स को खोलना और नीचे दिए गए आकृति जैसे ASP.NET वेबसाइट के .aspx पृष्ठ पर LINQDataSource नियंत्रण को ड्रैग और ड्रॉप करना आवश्यक है।

अगला कदम LINQDataSource को कर्मचारी रिकॉर्ड के लिए सभी कॉलमों का चयन करके कॉन्फ़िगर करना है।

अब .aspx पेज पर एक GridView Control जोड़ें और इसे नीचे दिए गए चित्र में दिखाए अनुसार कॉन्फ़िगर करें। GridView नियंत्रण शक्तिशाली है और डेटा के साथ काम करने के लिए लचीलापन प्रदान करता है। नियंत्रण को कॉन्फ़िगर करने के तुरंत बाद, यह ब्राउज़र में दिखाई देगा।

.Aspx पृष्ठ के लिए आपकी स्क्रीन पर अब देखी जा सकने वाली कोडिंग होगी -

<!DOCTYPE html>

<html>
   <head runat = "server">
      <title></title>
   </head>

   <body>
      <form id = "form1" runat = "server">
         <div>
            <asp:GridView ID = "GridView1" runat = "server" AutoGenerateColumns = "False"
			
               DataKeyNames = "ContactID" DataSourceID = "LINQDataSource1">
               <Columns>
			   
                  <asp:BoundField DataField = "ContactID" HeaderText = "ContactID"
                     InsertVisible = "False" ReadOnly="True" SortExpression = "ContactID" />
                  <asp:CheckBoxField DataField = "NameStyle" HeaderText = "NameStyle"
                     SortExpression = "NameStyle" />
                  <asp:BoundField DataField = "Title" HeaderText = "Title" SortExpression = "Title" />
                  <asp:BoundField DataField = "FirstName" HeaderText = "FirstName"
                     SortExpression="FirstName" />
                  <asp:BoundField DataField = "MiddleName" HeaderText = "MiddleName"
                     SortExpression = "MiddleName" />
                  <asp:BoundField DataField = "LastName" HeaderText = "LastName"
                     SortExpression = "LastName" />
                  <asp:BoundField DataField = "Suffix" HeaderText = "Suffix"
                     SortExpression = "Suffix" />
                  <asp:BoundField DataField = "EmailAddress" HeaderText = "EmailAddress"
                     SortExpression = "EmailAddress" />
               </Columns>

            </asp:GridView>

            <br />

         </div>

         <asp:LINQDataSource ID = "LINQDataSource1" runat = "server"

            ContextTypeName = "LINQWebApp1.AdventureWorksDataContext" EntityTypeName = ""
               TableName = "Contacts">

         </asp:LINQDataSource>
      </form>
   </body>
</html>

यहाँ यह ध्यान दिया जाना चाहिए कि डेटाबेस का प्रतिनिधित्व करने वाली कक्षा के लिए संपत्ति ContextTypeName सेट करना महत्वपूर्ण है। उदाहरण के लिए, यहाँ इसे LINQWebApp1.AdvtWorksDataContext के रूप में दिया गया है क्योंकि यह क्रिया LINQDataSource और डेटाबेस के बीच आवश्यक संबंध बनाएगी।

LINQ का उपयोग करके ASP.NET पेज में INSERT, UPDATE और DELETE डेटा

उपरोक्त सभी चरणों को सख्ती से पूरा करने के बाद, चुनें LINQDataSource Tasks वहाँ से LINQDataSource Control और इंसर्ट डालने के लिए सभी तीन बॉक्स चुनें, अपडेट को सक्षम करें और उसी से डिलीट को सक्षम करें, जैसा कि निम्नलिखित स्क्रीनशॉट में दिखाया गया है।

जल्द ही घोषणात्मक मार्कअप आपकी स्क्रीन पर निम्न के रूप में प्रदर्शित हो जाएगा।

<asp:LINQDataSource 
   ContextTypeName = "LINQWebApp1.AdventureWorksDataContext" 
   TableName = "Contacts" 
   EnableUpdate = "true" 
   EnableInsert = "true" 
   EnableDelete = "true" 
   ID = "LINQDataSource1" 
   runat = "server">
</asp:LINQDataSource>

अब चूंकि कई पंक्तियाँ और स्तंभ हैं, इसलिए ग्रिड के एक चयनित पंक्ति के विवरण को प्रदर्शित करने के लिए ग्रिड दृश्य नियंत्रण के नीचे विवरण दृश्य या मास्टर नियंत्रण के रूप में अपने .aspx प्रपत्र पर एक और नियंत्रण जोड़ना बेहतर है। डिटेल व्यू कंट्रोल से डिटेल व्यू टास्क चुनें और नीचे दिखाए अनुसार चेक बॉक्स चुनें।

अब, केवल परिवर्तनों को सहेजें और अपने ब्राउज़र में उस पृष्ठ को देखने के लिए Ctrl + F5 दबाएं जहां अब विवरण दृश्य नियंत्रण पर किसी भी रिकॉर्ड को हटाना, अपडेट करना, डालना संभव है।