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(); 

এই লিনাকের অভিব্যক্তিটি এই ব্যতিক্রমটিকে ছুঁড়ে ফেলেছে:

DbArithmeticExpression arguments must have a numeric common type.

সাহায্য করুন!


এর ফলাফল কী clientDateTime - o.ClientDateTimeStamp?
শাহকাল্পেশ

ER ব্যতিক্রম নিক্ষিপ্তভাবে টাইমস্প্যানের একটি বিষয় হওয়া উচিত।
নওয়াজ ndান্ডালা

উত্তর:


247

অ্যান্টিটি DateTimeফ্রেমওয়ার্ক 6 এবং এর আগের সংস্করণ সহ পাটিগণিত সমর্থিত নয়। আপনাকে DbFuntions * ব্যবহার করতে হবে । সুতরাং, আপনার বক্তব্যের প্রথম অংশের জন্য, এরকম কিছু:

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

নোট করুন যে DiffHoursপদ্ধতিটি গ্রহণ করে Nullable<DateTime>

সত্তা ফ্রেমওয়ার্ক কোর (যখন এসকিএল সার্ভারের সাথে ব্যবহার করা হয়, অন্য ডিবি সরবরাহকারী হতে পারে) ডেটটাইম AddXxxফাংশনগুলিকে সমর্থন করে (যেমন AddHours)। এগুলি DATEADDএসকিউএল-এ অনুবাদ করা হয়েছে।

* EntityFunctionsসত্তা ফ্রেমওয়ার্ক সংস্করণ 6 এর পূর্বে।


2

আমি জানি যে এটি একটি পুরানো প্রশ্ন তবে আপনার নির্দিষ্ট ক্ষেত্রে DBFunctions@ জার্টআরনল্ডের পরামর্শ অনুযায়ী ব্যবহার করার পরিবর্তে, আপনি কি ল্যাম্বডা থেকে প্রশ্নে পাটিগণিতকে অপারেশনটি সরাতে পারবেন না?

সর্বোপরি 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();

আপনি যদি অন্য কোনও ডেটটাইমের সাথে ফিক্স টাইমস্ট্যাম্পের সাহায্যে সঞ্চিত ডেটটাইমটি তুলনা করার চেষ্টা করছেন তবে সাধারণত এই রিফ্যাক্টরটি সম্ভব।


আমার এই সঠিক পরিস্থিতি ছিল এবং এটি সাহায্য করেছিল। তবে এই সমাধানের সুযোগটি নির্দিষ্ট ধরণের সমস্যার মধ্যে খুব সীমাবদ্ধ।
জিমানো

@ জিমানো এটি প্রযুক্তি পরিবর্তন করতে বা হ্যাকের অবলম্বন না করে ওপিএস সমস্যা সমাধান করে। যদি এটি এভাবে রিফ্যাক্টর করা যায় তবে এটি করুন, যদি না হয় তবে গ্রহণযোগ্য উত্তরের মতো করুন।
সিনিডেড

1

অন্য উপায়, যদি কর্মক্ষমতা সত্য লক্ষ্য না হয়, আপনি ব্যবহার করার চেষ্টা করতে পারেন AsEnumerable()। সুতরাং, এটি মত হবে

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

AsEnumerable () যুক্ত করা এসকিউএল কোয়েরিকে সত্তায় রূপান্তরিত করবে এবং তাদের উপর নেট ফাংশন চালানোর অনুমতি দেয়। আরও তথ্যের জন্য, AsEnumerable সম্পর্কে এখানে চেক করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.