डेविड बी का जवाब आप हो जाता है आप क्या चाहते हैं, लेकिन 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
क्षेत्र के लिए निर्धारित है, कार्यान्वयन नहीं रह गया है डेटाबेस के लिए एसक्यूएल कनेक्शन खोलने की जरूरत है और आप अब पूरी तरह से ऑफ़लाइन काम कर सकते हैं।
कृपया ध्यान दें कि यह पूर्ण-विश्वास प्रतिबिंब का उपयोग कर रहा है, जो मैं समझता हूं। आपको केवल उस दृष्टिकोण का उपयोग उस माहौल में करना चाहिए जिसे आप नियंत्रित करते हैं और जो आपकी असेंबली पर पूरी तरह भरोसा करता है।
स्रोत
2010-06-10 14:09:05
यह ठीक है:) ... लेकिन मुझे यह काम प्राप्त करने के लिए डीबी कनेक्शन खोला जाना चाहिए :) (मुझे नहीं पता क्यों:)) ... क्या आप जानते हैं कि दूसरा तरीका कैसा है? – zielu1