2009-02-15 20 views
12

मैं LINQ अभिव्यक्ति वृक्ष को SQL कथन में अनुवाद करना चाहता हूं और मैं इसके लिए अपना कोड नहीं लिखना चाहता हूं।LINQ से sql कथन का अनुवाद

उदाहरण:

var query = from c in Customers 
where c.Country == "UK" && 
     c.City == "London" 
select c); 

करने के लिए

SELECT ... FROM Customers AS c WHERE c.Country = "UK" AND c.City = "London" 

मैं DataContext.Log पता है, लेकिन मैं प्रयोग करना चाहते हैं:

query.ToSqlStatementString() 

उत्तर

17
CustomDataContext dc = new CustomDataContext(); 
IQueryable<Customer> query = 
    from c in dc.Customer 
    where c.Country == "UK" 
    select c; 
// 
string command = dc.GetCommand(query).CommandText; 
+0

यह ठीक है:) ... लेकिन मुझे यह काम प्राप्त करने के लिए डीबी कनेक्शन खोला जाना चाहिए :) (मुझे नहीं पता क्यों:)) ... क्या आप जानते हैं कि दूसरा तरीका कैसा है? – zielu1

10

डेविड बी का जवाब आप हो जाता है आप क्या चाहते हैं, लेकिन requirin की छिपी लागत है जी डेटाबेस कनेक्शन। ऐसा करने का कारण सर्वर से पूछकर SQL सर्वर संस्करण निर्धारित करना है।

/// <summary> 
/// Through reflection (HACK) this sets the MS impl of LINQ-to-SQL to not attempt connection to the database just 
/// to determine the SQL server version running to tailor the SQL query to. 
/// </summary> 
private static void hack_SetLINQ2SQLProviderMode(CustomDataContext db) 
{ 
    object provider = hack_GetLINQ2SQLProvider(db); 

    provider 
     .GetType() 
     .GetField("mode", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance) 
     .SetValue(provider, 2); 
} 

private static object hack_GetLINQ2SQLProvider(CustomDataContext db) 
{ 
    return db 
     .GetType() 
     .GetProperty("Provider", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic) 
     .GetValue(_db, new object[0]); 
} 

कॉल hack_SetLINQ2SQLProviderMode(db) जहां db अपने DataContext व्युत्पन्न वर्ग है: इससे बचने के लिए आप इस कोड का उपयोग करना चाहिए।

कि LINQ करने वाली एसक्यूएल के IQueryProvider के एमएस के कार्यान्वयन की mode क्षेत्र सेट हो जाएगा यह बताने के लिए आप एमएस SQL ​​सर्वर 2005, SetValue(provider, 2) ने संकेत दिया के लिए एसक्यूएल कोड उत्पन्न करने के लिए मतलब है। एमएस एसक्यूएल सर्वर 2008

के लिए एमएस एसक्यूएल सर्वर 2000 या 3 के लिए 1 का उपयोग करें इसका मतलब यह है कि जब mode क्षेत्र के लिए निर्धारित है, कार्यान्वयन नहीं रह गया है डेटाबेस के लिए एसक्यूएल कनेक्शन खोलने की जरूरत है और आप अब पूरी तरह से ऑफ़लाइन काम कर सकते हैं।

कृपया ध्यान दें कि यह पूर्ण-विश्वास प्रतिबिंब का उपयोग कर रहा है, जो मैं समझता हूं। आपको केवल उस दृष्टिकोण का उपयोग उस माहौल में करना चाहिए जिसे आप नियंत्रित करते हैं और जो आपकी असेंबली पर पूरी तरह भरोसा करता है।

+1

* बोगल *। साफ। –