2009-02-20 14 views
55

घटाकर LINQ से इकाइयों को मैं इकाई फ्रेमवर्क के साथ LINQ का उपयोग करके 2 तिथियों के बीच दिनों की संख्या निर्धारित करने का प्रयास कर रहा हूं। यह मुझे बता रहा है कि यह सिस्टम पर घटाना नहीं पहचानता है। टाइमस्पेन क्लास2 तारीख

यहां LINQ क्वेरी का मेरा हिस्सा है।

where ((DateTime.Now.Subtract(vid.CreatedDate).TotalDays < maxAgeInDays)) 

यहाँ त्रुटि मैं

{ "संस्थाओं को LINQ विधि 'System.TimeSpan घटाना (System.DateTime)' को नहीं पहचानता है विधि VS.NET डीबगर में प्राप्त है, और इस विधि को स्टोर अभिव्यक्ति में अनुवादित नहीं किया जा सकता है। "}

क्या मैं कुछ गलत कर रहा हूं या क्या इकाई ढांचे में 2 दिनांक समय के बीच दिनों की संख्या प्राप्त करने का एक बेहतर तरीका है?

धन्यवाद माइकल

+0

मैं भी करने के लिए सूत्र थोड़ा बदलकर समयावधि से बचने के लिए कोशिश की निम्नलिखित - जो अभी भी काम नहीं करता है जहां (vid.CreatedDate.AddDays (maxAgeInDays)> = DateTime.Now) –

उत्तर

41

यहाँ है मैं यह कैसे

मैं एक datetime चर कि सबसे पुरानी तारीख

DateTime oldestDate = DateTime.Now.Subtract(new TimeSpan(maxAgeInDays, 0, 0, 0, 0)); 
... 

तो मैं संशोधित LINQ क्वेरी

where (vid.CreatedDate >= oldestDate) 

की जहां भाग का प्रतिनिधित्व करता है परिभाषित काम मिल गया एक आकर्षण की तरह काम किया - धन्यवाद मीरा मुझे अभिव्यक्ति पेड़ के बारे में सोचने के लिए

+2

आपको उत्तर के रूप में @ मिकाह को ध्वजांकित करना चाहिए था और या तो अपनी प्रतिक्रिया में कोई टिप्पणी जोड़नी चाहिए या अंतिम प्रश्न के साथ अपना प्रश्न अपडेट करना चाहिए। – ongle

+0

चालाक, चालाक चालाक। सरल और सीधे आगे। मैं अभी भी सोच रहा हूं कि यह मेरे लिए पहली जगह क्यों नहीं आया था। –

11

आप क्योंकि विधेय एक अभिव्यक्ति पेड़ को अनुवाद करने की आवश्यकता isses इस तरह में चलाने। और अनुवाद प्रक्रिया डेटटाइम.Now.Subtract विधि को पहचान नहीं पाती है।

+0

वहाँ वैसे भी क्या करना है मैं ऐसा करने की कोशिश कर रहा हूं कि मुझे अभिव्यक्ति के पेड़ में अनुवाद किया जा सके? –

1

तथ्य यह है कि डिज़ाइन द्वारा, LINQ से इकाइयों को संपूर्ण क्वेरी को SQL कथन में अनुवाद करने की आवश्यकता होती है। यही वह जगह है जहां यह घटाव विधि को पहचान नहीं सकता है। यह तब भी होगा जब आप किसी क्वेरी के अंदर सी #/वीबी विधि का उपयोग करने का प्रयास करेंगे। इन मामलों में आपको क्वेरी से उस हिस्से को बाहर निकालने का एक तरीका पता लगाना होगा। इस पोस्ट में थोड़ा और अधिक बताते हैं: http://mosesofegypt.net/post/LINQ-to-Entities-what-is-not-supported.aspx

+0

साझा करने के लिए धन्यवाद यह उत्तर सही है, लेकिन यह निश्चित रूप से वह उत्तर नहीं है जिसे मैं चाहता था। LINQ से SQL ने जितनी चाहें उतनी विधियों को कॉल करने का समर्थन किया, इसलिए यह व्यापार-बंद दुर्भाग्यपूर्ण है। –

+2

लिंक मर चुका है। – Bijan

90

स्वीकार किए जाते हैं जवाब इस मामले में बेहतर है, लेकिन संदर्भ के लिए आप अन्य बातों के अलावा, तारीखों पर कार्रवाई करने EntityFunctions वर्ग का उपयोग कर सकते हैं।

where (vid.CreatedDate >= EntityFunctions.AddDays(DateTime.Now, -maxAgeInDay)) 
+0

धन्यवाद, यह वही है जो मैं ढूंढ रहा था। – wdanda

+3

ध्यान दें कि यह केवल एंटीटी फ्रेमवर्क v4 में समर्थित है। यह इकाई फ्रेमवर्क v1 के लिए काम नहीं करेगा। –

+0

EntityFunctions क्लास साझा करने के लिए धन्यवाद। बहुत उपयोगी – StackThis

18

तुम भी System.Data.Objects.EntityFucntions उपयोग कर सकते हैं:

currentDate = DateTime.Now; 

... 
where EntityFunctions.DiffDays(currentDate, vid.CreatedDate) < maxAgeIdDays 

EntityFunctions से सभी कार्यों केवल Linq करने वाली संस्थाओं के लिए कर रहे हैं और एसक्यूएल कार्यों के लिए मैप की जाती हैं।अब

public DateTime StartDate{ get; set; } 
    public DateTime EndDate{ get; set; } 
    public TimeSpan CalculateTime{ 
     get 
     { 
      return EndDate.Subtract(StartDate); 
     } 
    } 

, आप ऐसा ही कुछ प्रयोग कर सकते हैं:

+0

वे लिंक से इकाइयों के लिए भी काम करते हैं। –

+0

@ मॉर्टन: वह प्रकार था, वे केवल लिंक-टू-एंटिटीज के साथ काम करते थे। –

+0

कई SQL सर्वर विशिष्ट फ़ंक्शन 'System.Data.Objects.SqlClient.SqlFunctions' क्लास के माध्यम से उपलब्ध हैं। बेशक, काम करने के लिए डेटा स्टोर को SQL सर्वर होना चाहिए। अधिक जानकारी: http://msdn.microsoft.com/en-us/library/system.data.objects.sqlclient.sqlfunctions.aspx – bernhof

0

आप अपने मॉडल में नई संपत्ति को परिभाषित कर सकते

var query = from temp in db.Table 
select new MyModel { 
    Id = temp.Id, 
    Variable1 = temp.Variable1, 
    ... 
    EndDate = temp.EndDate, 
    StartDate = temp.StartDate 
} 

आप परिणाम पर नजर है, तो आप इस तरह के रूप वापसी का उपयोग कर सकते हैं:

return query 

अब, क्वेरी में, हमारे पास गणना समय है (एंडडेट और स्टार्टडेट के बीच घटाएं)।

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