2013-03-03 4 views
8

का उपयोग कर विधि सिंटेक्स में LINQ समझ को समझने के लिए कैसे करें एक उपकरण, प्रक्रिया या समाधान है जो निम्नलिखित LINQ क्वेरी सिंटेक्स को Lambdas (dot notation) के साथ विधि सिंटेक्स में परिवर्तित करेगा? मैं उम्मीद करता हूं कि समाधान निम्न क्वेरी सिंटेक्स को इस तरह के विधि सिंटेक्स में परिवर्तित करने की अपेक्षा करेगा।लैंबडा

var filteredEmployees = 
    from employee in allEmployees 
    where employee.DepartmentID < 4 && employee.EmployeeID < 10 
    orderby employee.DepartmentID descending, 
      employee.LastName descending 
    select employee; 
निम्नलिखित

var filteredEmployees2 = allEmployees.Where(employee => ((employee.DepartmentID < 4) && (employee.EmployeeID < 10))) 
     .OrderByDescending(employee => employee.DepartmentID) 
     .ThenByDescending(employee => employee.LastName); 

मैं विधि सिंटेक्स बेहतर जानने के लिए इस का उपयोग करना चाहते हूँ करने के लिए

उत्तर

15

LINQPad आपको जो चाहिए वह एक अच्छा टूल है। मैंने अपनी वेबसाइट से निम्नलिखित स्क्रीनशॉट को "चुरा लिया" बेहतर तरीके से चित्रित किया कि यह कैसे काम करता है। आप बटन पर क्लिक कर सकते हैं आप LINQ सिंटैक्स का उपयोग एक प्रश्न लिखते हैं तो लाल रंग में हाइलाइट बराबर लैम्ब्डा वाक्य रचना को देखने के लिए: enter image description here

+1

मैं LINQPad प्रीमियम है और यह करने के लिए एक महान उपकरण Lambda अभिव्यक्ति देखें। मैं कई सामानों के लिए उपयोग करता हूं, जैसे प्रोटोटाइपिंग एप्लिकेशन और बस टेस्टिग कोड। Webshot के लिए धन्यवाद; यह वास्तव में बिंदु को पाने में मदद करता है। –

7

यदि हम क्वेरी सिंटैक्स को एक प्रकार का IQueryable लौटने के लिए मजबूर करते हैं तो हम विधि सिंटेक्स प्राप्त कर सकते हैं।

यहाँ मैं क्वेरी बदल IQueryable के प्रकार के वापस जाने के लिए: "। सूची प्रकार वापसी प्रकार अब IQueryable होंगे, इसलिए"

IQueryable<Employee> filteredEmployees = 
    (from employee in allEmployees.AsQueryable() 
    where employee.DepartmentID < 4 && employee.EmployeeID < 10 
    orderby employee.DepartmentID descending, 
      employee.LastName descending 
    select employee); 

Console.WriteLine(filteredEmployees.ToString()); 

पिछले कोड हम allEmployees "करने के लिए AsQueryable()" जोड़ा में filteredEmployees "अब प्रकार के हो जाएगा" IQueryable "। तो फिर पर" filteredEmployees ToString() "विधि" सब हम क्या करने की जरूरत है कॉल है। "

और निम्नलिखित कंसोल के लिए लिखा है।

System.Collections.Generic.List`1[UserQuery+Employee] 
    .Where(employee => ((employee.DepartmentID < 4) AndAlso (employee.EmployeeID < 10))) 
    .OrderByDescending(employee => employee.DepartmentID) 
    .ThenByDescending(employee => employee.LastName) 

यह सही नहीं है, लेकिन हम आसानी से पिछले कोड मैं निकाला गया "System.Collections.Generic.List`1 [UserQuery + कर्मचारी]" में निम्नलिखित

IEnumerable<Employee> filteredEmployees2 = allEmployees 
     .Where(employee => ((employee.DepartmentID < 4) && (employee.EmployeeID < 10))) 
     .OrderByDescending(employee => employee.DepartmentID) 
     .ThenByDescending(employee => employee.LastName); 

Console.WriteLine(filteredEmployees); 

को यह संपादित करें और "allEmployees" से बदल दिया जा सकता है । मैं "0A32o" को "& &" के साथ भी बदलता हूं।

यह क्वेरी सिंटेक्स में क्वेरी के समान परिणाम देगा।

+0

यह एक अभिव्यक्ति पेड़ 'पैदा करेगा filteredEmployees.Expression' –

2

आप लैम्बडा अभिव्यक्ति की घोषणा करके अधिक प्रत्यक्ष अभिव्यक्ति प्राप्त कर सकते हैं जो कुछ वस्तु उत्पन्न करता है। वास्तविक अभिव्यक्ति वह क्वेरी होगी जिसे आप क्वेरी सिंटैक्स का उपयोग करके देखना चाहते हैं। फिर कंपाइलर द्वारा उत्पन्न अभिव्यक्ति वृक्ष का निरीक्षण करके, आप देख सकते हैं कि मूल क्वेरी को बदलने के बिना कौन सी विधि कॉल की जाती है।

Expression<Func<object>> fn =() => 
    from employee in allEmployees 
    where employee.DepartmentID < 4 && employee.EmployeeID < 10 
    orderby employee.DepartmentID descending, 
      employee.LastName descending 
    select employee; 
// inspect fn.Body 

IQueryable<> का प्रयोग के रूप में तुमने किया था एक ही क्वेरी लेकिन थोड़ा संशोधित वहाँ उत्पन्न नहीं करता है। AsQueryale() कॉल आपको अनदेखा करना है। ऐसी संभावना भी है कि क्वेरी प्रदाता अभिव्यक्ति को फिर से लिख सकता है ताकि ToString() का उपयोग करके आप वापस आ सकें 1: 1 पत्राचार नहीं हो सकता है। संकलक उत्पन्न अभिव्यक्ति बिल्कुल वही होगी जो आप उम्मीद करेंगे।