2016-10-02 11 views
6

में TimeSpan के लिए दिनांक समय परिवर्तित करने के लिए मैं इकाई की रूपरेखा 6 के साथ इस LINQ प्रश्न हैं:कैसे इकाई की रूपरेखा क्वेरी

var timeCapturesQuery = Context.TimeCaptures 
    .Where(t => 
     && t.StartDateTime.TimeOfDay < endTime 
     && t.EndDateTime.TimeOfDay > startTime); 

ENDTIME और StartTime प्रकार TimeSpan की parmeters हैं, StartDateTime और EndDateTime datetime की मेज पर स्तंभ हैं।

दुर्भाग्य से मैं इस त्रुटि जब यह चलाया जाता है मिलती है:

निर्दिष्ट प्रकार सदस्य 'TimeOfDay' संस्थाओं के लिए LINQ में समर्थित नहीं है। केवल प्रारंभकर्ता, इकाई सदस्य, और इकाई नेविगेशन गुण समर्थित हैं।

कैसे मैं एक TimeSpan इस LINQ क्वेरी में दिनांक समय (अर्थात एसक्यूएल में datetime से time) से मिल सकता है?

+0

क्षमा करें, लेकिन मैं नहीं दिख रहा है कि कैसे मदद कर सकता है। आप डेटटाइम को स्ट्रिंग में कनवर्ट कर रहे हैं, फिर डेटटाइम पर वापस उस संपत्ति को कॉल कर रहे हैं जो त्रुटि को फेंकता है। यह भी याद रखें कि StartDateTime एक तालिका पर एक स्तंभ है, पैरामीटर नहीं। –

+0

पौलुस ने क्या कहा [http://stackoverflow.com/questions/32756662/timeofday-is-not-supported-in-linq-to-entities-find-total-seconds-in-linq-2) काम कर सकता है। – Berkay

+1

इस बारे में [समाधान] (http://stackoverflow.com/a/21289257/5460854) – CodeMaster

उत्तर

3

DbFunctions.CreateTime की तरह लग रहा है क्या आप देख रहे हैं:

जब संस्थाओं क्वेरी के लिए एक LINQ के हिस्से के रूप में इस्तेमाल किया, इस विधि एक नया TimeSpan वस्तु बनाने के लिए विहित CreateTime ईडीएम समारोह का आह्वान ।

तो दो बार के बीच परिणाम पाने के लिए, आप:

var timeCapturesQuery = Context.TimeCaptures 
    .Where(t => DbFunctions.CreateTime(t.StartDateTime.Hour, t.StartDateTime.Minute, t.StartDateTime.Second) < endTime && 
     DbFunctions.CreateTime(t.EndDateTime.Hour, t.EndDateTime.Minute, t.EndDateTime.Second) > startTime); 
0

ऐसा लगता है कि Linq2db इसका समर्थन करता है।

https://github.com/linq2db/linq2db/blob/1ff760181717c73859ab3a5519f76943241d460f/Source/Linq/Expressions.cs

बेशक

यह नया ORM उपयोग करने के लिए बहुत अच्छा विकल्प नहीं है।
लेकिन मुझे लगता है कि यह प्रदर्शन के बाद ईएफ का सबसे कमजोर हिस्सा है।
तो शायद यह फिर से सोचने का अच्छा समय है।

लिंक 2 डीबी के साथ आप कस्टम एसक्यूएल तर्क प्रदान कर सकते हैं (आपको अपनी अभिव्यक्ति बनाने की आवश्यकता है)। यह मेरे लिए कभी जरूरी नहीं था, लेकिन आप अधिक जानकारी के लिए this पढ़ सकते हैं।

+0

ईएफ से दूर स्विच करना एक विकल्प नहीं है। –

2

संपत्ति टाइमऑफडे LINQ से इकाइयों में समर्थित नहीं है, इसलिए आप इसके बजाय SqlFunctions.DatePart विधि का उपयोग करने का प्रयास कर सकते हैं।

आपको शायद अपने टाइमस्पेन्स को डेटटाइम्स में भी परिवर्तित करना चाहिए।

मुझे लगता है कि यह काम करना चाहिए (timespans संभालने दिन की शुरुआत से है):

var now = DateTime.Now; 
var today = new DateTime(now.Year, now.Month, now.Day); 

var endDateTime = today + endTime; 
var startDateTime = today + startTime 

var timeCapturesQuery = Context.TimeCaptures.Where(t => 
          SqlFunctions.DatePart("timeofday", t.StartDateTime) < SqlFunctions.DatePart("timeofday", endDateTime) 
          && SqlFunctions.DatePart("timeofday", t.EndDateTime) > SqlFunctions.DatePart("timeofday", startDateTime)); 

संपादित

टिप्पणियां विशिष्ट संपत्ति TimeOfTheDay DatePart विधि में समर्थित नहीं है में उल्लेख किया ।

शायद EntityFunctions.DiffNanoseconds विधि काम करेगा:

var now = DateTime.Now; 
var today = new DateTime(now.Year, now.Month, now.Day); 

var endDateTime = today + endTime; 
var startDateTime = today + startTime 

var timeCapturesQuery = Context.TimeCaptures.Where(t => 
          EntityFunctions.DiffNanoseconds(t.StartDateTime, endDateTime).Value < 0 
          && EntityFunctions.DiffNanoseconds(t.EndDateTime, startDateTime).Value > 0); 

EDIT2

एक अन्य विकल्प जो बहुत सरल है और मुझे लगता है कि सिर्फ datetimes तुलना करने के लिए किया जाता है काम करेंगे।

हमने पहले से ही टाइमस्पेन्स को डेटटाइम में परिवर्तित कर दिया है और हम LINQ से इकाइयों का उपयोग करके एक साधारण स्थिति बना सकते हैं और इसे काम करना चाहिए क्योंकि हम किसी भी दिनांक-समय गुणों का उपयोग नहीं कर रहे हैं।

var now = DateTime.Now; 
var today = new DateTime(now.Year, now.Month, now.Day); 

var endDateTime = today + endTime; 
var startDateTime = today + startTime 

var timeCapturesQuery = Context.TimeCaptures.Where(t => t.StartDateTime < endDateTime && t.EndDateTime > startDateTime); 
+0

DATEPART के लिए कोई "टाइमफ़ोडे" तर्क नहीं है। –

+0

कृपया मेरे संपादन का संदर्भ लें। – YuvShap

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