2010-11-10 11 views
85

मेरे आवेदन में मैं इकाई फ्रेमवर्क का उपयोग कर रहा हूं।लिंक से EntityFramework डेटटाइम

मेरे टेबल

-Article 
-period 
-startDate 

मैं रिकॉर्ड से मेल खाने वाले की जरूरत है =>DateTime.Now > startDate and (startDate + period) > DateTime.Now

मैं इस कोड लेकिन इसकी अब काम करने की कोशिश की

Context.Article 
    .Where(p => p.StartDate < DateTime.Now) 
    .Where(p => p.StartDate.AddDays(p.Period) > DateTime.Now) 

जब मैं अपने कोड को चलाने के निम्न अपवाद होते हैं

LINQ to Entities does not recognize the method 'System.DateTime AddDays(Double)' method, and this method cannot be translated into a store expression.

+0

किस प्रकार 'period' है? 'AddDays' गलत कार्य है यदि यह' डबल' है। –

+0

अवधि का प्रकार int – Yucel

उत्तर

160

LINQ से Entity Framework का उपयोग करते समय, आपके अनुमानों को कहां क्लॉज में SQL में अनुवादित किया जाता है। आपको वह त्रुटि मिल रही है क्योंकि DateTime.Add() के लिए SQL में कोई अनुवाद नहीं है जो समझ में आता है।

एक त्वरित काम के आसपास पहले के परिणामों को पढ़ने के लिए कहाँ स्मृति में बयान और उसके बाद वस्तुओं के लिए LINQ का उपयोग छानने खत्म करने के लिए किया जाएगा:

Context.Article.Where(p => p.StartDate < DateTime.Now) 
       .ToList() 
       .Where(p => p.StartDate.AddDays(p.Period) > DateTime.Now); 

तुम भी EntityFunctions.AddDays विधि अगर आप की कोशिश कर सकते .NET 4.0 का उपयोग कर:

Context.Article.Where(p => p.StartDate < DateTime.Now) 
       .Where(p => EntityFunctions.AddDays(p.StartDate, p.Period) 
        > DateTime.Now); 

नोट: EF 6 में यह अब है System.Data.Entity.DbFunctions.AddDays

+32

यह एक खतरनाक काम है, क्या होता है यदि ToList() बड़ी मात्रा में डेटा लौटाता है? –

+0

@ स्टेफन पी। - फिर पहला कथन स्मृति में बड़ी मात्रा में डेटा पढ़ेगा। दूसरी विधि ठीक होनी चाहिए, लेकिन यह केवल .NET 4.0 के साथ उपलब्ध है। –

+6

EntityFunctions के लिए धन्यवाद। एडडेज़ टिप मैं ईएफनेट 4.0 का उपयोग कर रहा हूं लेकिन मुझे EntityFunctions के बारे में पता नहीं था, इसमें देखेंगे। –

3

कैसे DateTime.Now से 2 दिन घटाकर के बारे में:

Context.Article 
.Where(p => p.StartDate < DateTime.Now) 
.Where(p => p.StartDate > DateTime.Now.Subtract(new TimeSpan(2, 0, 0, 0))) 

ईमानदारी से कहूं तो मुझे नहीं सुनिश्चित करें कि आप क्या प्राप्त करना चाहते हैं, लेकिन इस

+0

लेख स्टार्टडेट पर दिखाए जाने और एक्स (अवधि) दिनों के बाद समाप्त होने लगेगा। यही वह है जो मैं करने की कोशिश कर रहा हूं। जस्टिन निसनेर का दूसरा समाधान बहुत अच्छा काम करता है जो मैं – Yucel

+1

देखना चाहता हूं मुझे सबट्रैक्ट का उपयोग करके एक ही त्रुटि मिली! –

71

काम कर सकते हैं मुझे लगता है कि यह क्या है कि पिछले है जवाब सुझाव देने के लिए कोशिश कर रहा था, बल्कि (कुछ है कि एक एसक्यूएल बयान में परिवर्तित नहीं किया जा सकता है) क्यों कुछ करना नहीं है कि एसक्यूएल के बराबर किया जा सकता है p.startdat दिन जोड़ने की कोशिश कर की तुलना में:

var baselineDate = DateTime.Now.AddHours(-24); 

something.Where(p => p.startdate >= baselineDate) 
+7

अधिक वोटों के साथ स्वीकृत उत्तर की तुलना में यह एक बेहतर जवाब है। यह आसान, सुरक्षित और अधिक कुशल है। –

+1

@Adrian Carr - यह इस उपयोग के मामले के लिए बेहतर हो सकता है लेकिन 'EntityFunctions' समाधान' के लिए नहीं। यहां, दूसरा ऑपरेंड क्वेरी में किसी अन्य इकाई से पुनर्प्राप्त नहीं किया गया है और पूछताछ से पहले गणना की जा सकती है। यदि दोनों ऑपरेंड डीबी में पाए जाते थे, तो 'एंटीटीफंक्शन' समाधान अभी भी उपयुक्त होगा जबकि इस प्रतिक्रिया का समाधान अब और काम नहीं करेगा। –

1

यदि आपको आवश्यकता है कि आपकी अभिव्यक्ति को एसक्यूएल में अनुवादित किया गया है तो आप

सिस्टम.डाटा.एन्टिटी.कोर.ऑब्जेक्ट्स। एडडेज़ विधि का उपयोग करने का प्रयास कर सकते हैं।

असल में अप्रचलित चिह्नित है लेकिन यह काम करता है। यह System.Data.Entity.DbFunctions.AddDays द्वारा प्रतिस्थापित किया जाना चाहिए लेकिन मैं यह नहीं मिल सकता है ...

+0

यह 4 साल पहले स्वीकृत उत्तर से ज्यादा कुछ नहीं जोड़ता है! –

+0

@AndrewHarris भी मेरा जवाब 4 साल पहले जवाब है। उत्तर के पहले संस्करण में कहां से पहले एक उत्तरसूची (=> डेटा भौतिककरण) था (उत्तर की पहली टिप्पणी देखें)। – bubi

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