2010-03-17 10 views
6

मैं यह क्यों नहीं कर सकते हैं:LINQ से संस्थाएं कुछ तरीकों को क्यों पहचानती नहीं हैं?

usuariosEntities usersDB = new usuariosEntities();  
foreach (DataGridViewRow user in dgvUsuarios.Rows) 
{ 
    var rowtoupdate = 
     usersDB.usuarios.Where(
     u => u.codigo_usuario == Convert.ToInt32(user.Cells[0].Value) 
     ).First(); 
    rowtoupdate.password = user.Cells[3].Value.ToString(); 
} 
usersDB.SaveChanges(); 

और यह करना है:

usuariosEntities usersDB = new usuariosEntities();  
foreach (DataGridViewRow user in dgvUsuarios.Rows) 
{ 
    int usercode = Convert.ToInt32(user.Cells[0].Value); 
    var rowtoupdate = 
     usersDB.usuarios.Where(u => u.codigo_usuario == usercode).First(); 
    rowtoupdate.password = user.Cells[3].Value.ToString(); 
} 
usersDB.SaveChanges(); 

मैं मानता चाहिए कि यह एक अधिक पठनीय कोड है, लेकिन क्यों नहीं कर सकते यह किया जा सकता है?

उत्तर

9

इसके बारे में बात यह है कि LINQ प्रश्नों से बदल रहे हैं एक अभिव्यक्ति पेड़ में संकलक। यह अभिव्यक्ति पेड़ तब टी-एसक्यूएल में परिवर्तित हो जाता है और सर्वर पर भेज दिया जाता है। LINQ से SQL कुछ स्ट्रिंग जैसे कुछ तरीकों को मानचित्र करता है। टी-एसक्यूएल समकक्षों के साथ आता है।

पहले उदाहरण में, LINQ जाहिरा तौर पर Convert.ToInt32 कुछ भी करने के लिए नक्शे नहीं है और अपवाद फेंक दिया है। कारण यह अपने दूसरे उदाहरण में काम करता है क्योंकि Convert.ToInt32 कॉल क्वेरी की बाहर किया जाता है तो यह अभिव्यक्ति पेड़ का हिस्सा नहीं है और T-SQL करने के लिए परिवर्तित करने की आवश्यकता नहीं है।

This MSDN page वर्णन करता है कि LINQ से SQL कैसे विभिन्न डेटा प्रकारों, ऑपरेटरों और विधियों को टी-एसक्यूएल में अनुवादित करता है। (हालांकि प्रलेखन का सुझाव है कि Convert.ToInt32 समर्थित है, इसलिए मुझे यकीन नहीं है कि यहां और क्या हो रहा है।)

क्षमा करें, यह एहसास हुआ कि यह ADO.NET इकाई फ्रेमवर्क है, LINQ से SQL नहीं। This page lists एडीओ.NET इकाई फ्रेमवर्क मैपिंग्स। यह थोड़ा अधिक प्रतिबंधक है, अधिकतर क्योंकि इसे कई प्रदाताओं के साथ काम करने की ज़रूरत है।

+1

वहाँ T-SQL कार्यों के लिए L2E नक्शा इन तरीकों/कार्य करने के लिए एक तरीका है? +1 स्पष्ट स्पष्टीकरण – Luiscencio

+0

नहीं, लेकिन यदि आप SQL में उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन बनाते हैं और इसे अपने डेटा संदर्भ में जोड़ते हैं, तो आप उन्हें अपने प्रश्नों में उपयोग कर सकते हैं। – Josh

+0

इसलिए यदि मैं अपने DB के लिए mysql का प्रयोग करना और संग्रहीत प्रक्रिया जोड़ने हूँ मैं इसे किसी भी तरह कॉल कर सकते हैं? – Luiscencio

0

Ent करने के लिए अपने LINQ क्योंकि। सभी मेटा डेटा के साथ MSIL में क्वेरी को संकलित नहीं है, लेकिन बस कुछ extantion तरीकों में क्वेरी तब्दील हो और भाषाओं का का लैम्ब्डा पार्स abuilities को घिरा है। इसका मतलब है कि

इस कोड:
var results = from c in SomeCollection where c.SomeProperty < someValue * 2 select new {c.SomeProperty, c.OtherProperty};

इस रूप में ही है:

var results = SomeCollection
.Where(c => c.SomeProperty < someValue * 2)
.Select(c => new {c.SomeProperty, c.OtherProperty});

संबंधित मुद्दे