2012-09-19 29 views
6

के साथ लिंक को एसक्यूएल के रूप में एसक्यूएल का उपयोग करना this दृष्टिकोण की तुलना में नए सी # 5 async/await कीवर्ड के साथ एल 2 एस का उपयोग करने के लिए सर्वोत्तम प्रथाएं क्या हैं? वेब पर कोई नहीं मिला।नए एसिंक/प्रतीक्षा

+0

शायद यह कुछ आवरण या कुछ बनाने के लिए संभव है? बीटीडब्ल्यू, क्या नवीनतम ईएफ को एसिंक/प्रतीक्षा के लिए समर्थन है? – UserControl

उत्तर

6

एफई 5 async/इंतजार समर्थन नहीं है, लेकिन खुला स्रोत संस्करण को सक्रिय रूप से यहां संभावनाओं को देख रही है। संपादित करें: ईएफ में असिंक समर्थन http://msdn.microsoft.com/en-us/data/jj819165.aspx पर प्रलेखित है। यह परिणामों को स्ट्रीम नहीं करता है क्योंकि वे हाइड्रेटेड होते हैं (जैसा कि आप आरएक्स के साथ पाएंगे) लेकिन यह डेटाबेस को असीमित कॉल करता है।

LINQ से SQL के लिए, कार्य में अपना अनुरोध लपेटने के बाहर। फैक्ट्री। स्टार्ट ऑपरेशन, मैं अपनी सांस को उम्मीद नहीं करता कि कार्य आधारित async (async/await के लिए आवश्यक) को माइक्रोसॉफ्ट द्वारा लिंक के लिए लागू किया जाएगा एसक्यूएल के लिए।

आप IQToolkit उपयोग करें और यह अगर बिल्कुल जरूरी अपनी खुद की async समर्थन जोड़ने का विस्तार कर सकते हैं। इसके अलावा, मोनो ने LINQ को SQL को कार्यान्वित किया है जिसे आप एसिंक समर्थन के साथ विस्तारित करने में सक्षम हो सकते हैं।

3

स्कॉट हैनसेलमैन के पास interesting post है जहां वह दर्शाता है कि कोई मौजूदा लिंक से SQL क्वेरी के शीर्ष पर एसिंक एपीआई कैसे उत्पन्न कर सकता है। मैं बार भी विचार के साथ चारों ओर खेलने नहीं दिया है, लेकिन मेरा अनुमान है कि एक एक अधिक सामान्य विस्तार विधि होगा उसी तकनीक का प्रकार IQueryable या IEnumerable की किसी भी वस्तु को विस्तार करने की अनुमति देता है जो बना सकते हैं कि।

यहाँ कोड सीधे अपने पद से एक संदर्भ के रूप में उपयोग किया जा सके।

SqlCommand _beginFindCmd = null; 

public IAsyncResult BeginFind(int id, AsyncCallback callback, Object asyncState) 
{ 
    var query = from w in _db.Widgets 
       where w.Id == id 
       select w; 
    _beginFindCmd = _db.GetCommand(query) as SqlCommand; 
    _db.Connection.Open(); 
    return _beginFindCmd.BeginExecuteReader(callback, asyncState, System.Data.CommandBehavior.CloseConnection); 
} 

public Widget EndFind(IAsyncResult result) 
{ 
    var rdr = _beginFindCmd.EndExecuteReader(result); 
    var widget = (from w in _db.Translate<Widget>(rdr) 
        select w).SingleOrDefault(); 
    rdr.Close(); 
    return widget; 
} 

काम का एक छोटा सा के साथ एक इस TPL और इसी तरह और भी क्लीनर एक भी async पद्धति के रूप में बना सकते हैं। अगर मुझे ऐसा करने का मौका मिलता है तो मैं जो पोस्ट करता हूं उसे पोस्ट करूंगा।