DbArithmeticExpression तर्क में एक संख्यात्मक सामान्य प्रकार होना चाहिए


120
TimeSpan time24 = new TimeSpan(24, 0, 0);
TimeSpan time18 = new TimeSpan(18, 0, 0);    

// first get today's sleeping hours
List<Model.Sleep> sleeps = context.Sleeps.Where(
    o => (clientDateTime - o.ClientDateTimeStamp < time24) && 
          o.ClientDateTimeStamp.TimeOfDay > time18 && 
          clientDateTime.TimeOfDay < time18 && 
          o.UserID == userid).ToList(); 

यह Linq अभिव्यक्ति इस अपवाद को फेंकता है:

DbArithmeticExpression arguments must have a numeric common type.

कृपया सहायता कीजिए!


के परिणाम क्या है clientDateTime - o.ClientDateTimeStamp?
शाहकलेश 10

ईएफ़एम अपवाद में नॉरमली को टाइमस्पैन का एक उद्देश्य होना चाहिए।
नवाज ढंडला

जवाबों:


247

DateTimeइकाई फ्रेमवर्क 6 और इससे पहले के अंकगणित में समर्थित नहीं है। आपको DbFunctions * का उपयोग करना होगा । तो, आपके कथन के पहले भाग के लिए, कुछ इस प्रकार है:

var sleeps = context.Sleeps(o =>
    DbFunctions.DiffHours(o.ClientDateTimeStamp, clientDateTime) < 24);

ध्यान दें कि DiffHoursविधि स्वीकार करती है Nullable<DateTime>

इकाई फ्रैमवर्क कोर (एसक्यूएल सर्वर के साथ प्रयोग किया जाता है, शायद अन्य डीबी प्रदाता) डेटाइम AddXxxफ़ंक्शन (जैसे AddHours) का समर्थन करता है । वे DATEADDSQL में अनुवादित हैं ।

* EntityFunctionsएंटिटी फ्रेमवर्क संस्करण 6 से पहले।


2

मुझे पता है कि यह एक पुराना सवाल है, लेकिन DBFunctions@GertArnold द्वारा सुझाए गए उपयोग के बजाय आपके विशिष्ट मामले में , क्या आप लैम्बडा से प्रश्न में अंकगणित के संचालन को उल्टा नहीं कर सकते?

सब के बाद clientDateTimeऔर time24निश्चित मान हैं, इसलिए उनके अंतर को हर पुनरावृत्ति में पुनर्गणना करने की आवश्यकता नहीं है।

पसंद:

TimeSpan time24 = new TimeSpan(24, 0, 0);
TimeSpan time18 = new TimeSpan(18, 0, 0);    

var clientdtminus24 = clientDateTime - time24;

// first get today's sleeping hours
List<Model.Sleep> sleeps = context.Sleeps.Where(
    o => (clientdtminus24 < o.ClientDateTimeStamp) && 
          o.ClientDateTimeStamp.TimeOfDay > time18 && 
          clientDateTime.TimeOfDay < time18 && 
          o.UserID == userid).ToList();

यह रिफ्लेक्टर आम तौर पर संभव है यदि आप एक फिक्स टाइमस्टैम्प द्वारा शिफ्ट किए गए डेटाटाइम को दूसरे डेटाइम के साथ तुलना करने की कोशिश कर रहे हैं।


मेरे पास यह सटीक स्थिति थी, और इससे मदद मिली। हालांकि, इस समाधान का दायरा एक विशिष्ट प्रकार की समस्या तक सीमित है।
ज़िमानो

@Zimano यह प्रौद्योगिकी या हैक्स को बदलने की आवश्यकता के बिना ओपी समस्या हल करती है। यदि इसे इस तरह से फिर से बनाया जा सकता है तो इसे करें, यदि नहीं तो स्वीकार किए गए उत्तर में इसे पसंद करें।
जल्द ही मरे 25:19

1

दूसरा तरीका, यदि प्रदर्शन सही लक्ष्य नहीं है, तो आप उपयोग करने का प्रयास कर सकते हैं AsEnumerable()। तो, यह ऐसा होगा

List<Model.Sleep> sleeps = context.Sleeps.AsEnumerable().Where(....

AsEnumerable () जोड़ना SQL क्वेरी को इकाई में परिवर्तित करेगा और उन पर .Net फ़ंक्शंस चलाने की अनुमति देगा। अधिक जानकारी के लिए, AsEnumerable के बारे में यहां देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.