নির্দিষ্ট ধরণের সদস্য 'তারিখ' লিনকিউতে সত্তা ব্যতিক্রম সমর্থিত নয়


105

নিম্নলিখিত বিবৃতিগুলি প্রয়োগ করার সময় আমি একটি ব্যতিক্রম পেয়েছি।

 DateTime result;
 if (!DateTime.TryParse(rule.data, out result))
     return jobdescriptions;
 if (result < new DateTime(1754, 1, 1)) // sql can't handle dates before 1-1-1753
     return jobdescriptions;
 return jobdescriptions.Where(j => j.JobDeadline.Date == Convert.ToDateTime(rule.data).Date );

ব্যতিক্রম

The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

আমি ব্যতিক্রমটির অর্থ জানি তবে এটি থেকে কীভাবে মুক্তি পাবেন তা আমি জানি না। কোন সাহায্য?


এটি EF6 এবং নিম্নে। ইএফ কোর সমর্থন করে .Date
গার্ট আর্নল্ড

উত্তর:


102

সংস্থাগুলিতে লিনকিউ সর্বাধিক নেট নেট তারিখ পদ্ধতি (আপনি ব্যবহৃত কাস্টিং সহ) এসকিউএলে অনুবাদ করতে পারবেন না কারণ সমতুল্য এসকিউএল নেই।

সমাধানটি হল লিনকিউ স্টেটমেন্টের বাইরে তারিখ পদ্ধতিগুলি ব্যবহার করা এবং তারপরে একটি মান পাস করা। দেখে মনে হচ্ছে কনভার্ট.টোডেটটাইম (নিয়ম.ডাটা) ate তারিখ ত্রুটি ঘটায়।

ডেটটাইম বৈশিষ্ট্যে তারিখ কল করাও এসকিউএল-তে অনুবাদ করা যায় না, কাজেই কাজ করার চেষ্টা করা হয়। বছরের সাথে .মেনথ এবং .ড বৈশিষ্ট্যগুলি লিনকুতে অনুবাদ করা যেতে পারে যেহেতু তারা কেবলমাত্র পূর্ণসংখ্যা।

var ruleDate = Convert.ToDateTime(rule.data).Date;
return jobdescriptions.Where(j => j.Deadline.Year == ruleDate.Year 
                       && j.Deadline.Month == ruleDate.Month 
                       && j.Deadline.Day == ruleDate.Day);

6
জে => j.JobDeadline.Dateকি?
নীহারিকা

1
তারিখটি জবডিডলাইনে কোনও সম্পত্তি? এটি নিজের দ্বারা কোনও ত্রুটি ঘটায় না - সম্ভবত নামকরণের বিরোধ (তবে এটি সম্পর্কে নিশ্চিত নয়)। যদি লাইনটি এখনও ত্রুটি সৃষ্টি করে তবে এটির নাম পরিবর্তন করে ডেডলাইনসেট বা অনুরূপ।
জুডো

1
তারিখটি জবডিডলাইনে সম্পত্তি। জবডিডলাইন হল তারিখটাইম টাইপ যার মধ্যে আমি তারিখটি বের করতে চাই।
নীহারিকা

তারপরে, লিনকিউ-তে এটি কাজ করার জন্য আপনাকে কেবল জবডিডলাইন বৈশিষ্ট্যের তুলনা করতে হবে, যেমন j.JobDeadline> नियम তারিখ। এটির জন্য কিছুটা টেস্টিং দরকার তবে কাজ করার জন্য তৈরি করা যেতে পারে। বিকল্পভাবে .মুনথ .ডেই এবং .ইয়ার (জে.ডেডলাইন.ইয়ার == নিয়ম তারিখ.ইয়ার অ্যান্ড জে.ডেডলাইন.মোনথ == নিয়ম তারিখ.মোনথ এবং জে.ডাডলাইন.ডে == নিয়ম তারিখ.ডে) এর তিনটি বৈশিষ্ট্যের তুলনা করুন। মার্জিত নয় তবে এটি কাজ করে কারণ এগুলি কেবল পূর্ণসংখ্যা।
জুডো

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

230

আপনি ব্যবহার করতে পারেন TruncateTime পদ্ধতি EntityFunctions একটি সঠিক অনুবাদের অর্জন করা Dateএসকিউএল মধ্যে সম্পত্তি:

using System.Data.Objects; // you need this namespace for EntityFunctions

// ...

DateTime ruleData = Convert.ToDateTime(rule.data).Date;
return jobdescriptions
    .Where(j => EntityFunctions.TruncateTime(j.JobDeadline) == ruleData);


আপডেট: EntityFunctions EF6, অবচয় ব্যবহার করা হয়DbFunctions.TruncateTime


ঠিক আছে, আমি লক্ষ্য করেছি যে ruleDataএটি DateTimeটাইপ এবং j.JobDeadlineকাটা সময় আছে। ঠিক মনে হচ্ছে না। ব্যতিক্রম পাননি তবে প্রত্যাশিত ফলাফলও পাননি।
নীহারিকা

@aneal: এটা সকল রেকর্ড যেখানে ফেরৎ JobDeadlineএকই হয়েছে তারিখ হিসাবে rule.data, সেটা ব্যাপার কি দিনের সময় । প্রশ্নটিতে আপনার ক্যোয়ারী দিয়ে আপনি এটি অর্জন করতে চান না? কেন এটা ঠিক মনে হচ্ছে না?
স্লুমা

1
+1 এবং আমি উপরের সাথে একমত, অবশ্যই 99% বাস্তবায়নের জন্য উত্তম উত্তর
জিম টোলান

26
নোট যেটি EntityFunctionsEF6 এ অবমূল্যায়িত হয়েছে, আপনার এখন ব্যবহার করা উচিত DbFunctions
জুলিয়ান এন

2
> EF6 মধ্যে DbFunctions জন্য নামস্থান হয় System.Data.Entity: msdn.microsoft.com/en-us/library/Dn220142(v=VS.113).aspx
GraehamF

39

EF6 এর জন্য পরিবর্তে DbFunitions.TruncateTime (মাইডেট) ব্যবহার করুন।


9

"এন্টিফিউশনস.ট্রানকেটটাইম" বা ইফ F এ "ডিবিফিউশনস.ট্রুনকেটটাইম" কাজ করছে তবে এটিতে বিগ ডেটাতে কিছু পারফরম্যান্স সমস্যা রয়েছে।

আমি মনে করি সবচেয়ে ভাল উপায়টি এটির মতো আচরণ করা:

DateTime ruleDate = Convert.ToDateTime(rule.data);

DateTime  startDate = SearchDate.Date;

DateTime  endDate = SearchDate.Date.AddDay(1);

return jobdescriptions.Where(j.Deadline >= startDate 
                       && j.Deadline < endDate );

এটি তারিখের অংশগুলি ব্যবহার করার চেয়ে ভাল। কারণ ক্যোয়ারী বড় ডেটাতে দ্রুত চালিত হয়।


এই উত্তরের জন্য +1। EntityFunctions.TruncateTime(পরে প্রতিস্থাপিত DbFunctions.TruncateTime) এসকিউএল রূপান্তর করে প্রয়োগ করা হয় যেখানে ডেটটাইম স্ট্রিংয়ে রূপান্তরিত হয় এবং এটি কেটে যায়। প্রক্রিয়াজাত রেকর্ডের সংখ্যার অনুপাতে এটি কোয়েরিকে উল্লেখযোগ্যভাবে ধীর করে দেয়।
urig

3

অন্তর্ভুক্ত করা প্রয়োজন using System.Data.Entity;। এমনকি ভাল কাজ করেProjectTo<>

var ruleDate = rule.data.Date;
return jobdescriptions.Where(j => DbFunctions.TruncateTime(j.Deadline) == ruleDate);


1

এর অর্থ হ'ল লিনিকিউ থেকে এসকিউএল কীভাবে Dateসম্পত্তিটিকে একটি এসকিউএল এক্সপ্রেশনে রূপান্তর করতে জানে না । কারণ কাঠামোর Dateসম্পত্তিটির DateTimeএসকিউএলে কোনও অ্যানালগ নেই।



0

আমার একই সমস্যা তবে আমি ডেটটাইম-রেঞ্জের সাথে কাজ করি। আমার সমাধান হ'ল শুরুর সময়টি (যে কোনও তারিখের সাথে) 00:00:00 এবং শেষ-সময়কে 23:59:59 এ চালিত করা উচিত, সুতরাং আমার আর আমার ডেটটাইমটিকে তারিখে রূপান্তর করতে হবে না, বরং এটি ডেটটাইম থেকে যায়।

আপনার যদি মাত্র একটি ডেটটাইম থাকে তবে আপনি শুরুর সময়টি (যে কোনও তারিখের সাথে) 00:00:00 এ এবং শেষ-সময়কে 23:59:59 এ সেট করতে পারেন তারপরে আপনি সন্ধান করুন যেন এটি কোনও সময়সীমা।

var from = this.setStartTime(yourDateTime);
var to = this.setEndTime(yourDateTime);

yourFilter = yourFilter.And(f => f.YourDateTime.Value >= from && f.YourDateTime.Value <= to);

আপনি এটি ডেটটাইম-রেঞ্জের সাহায্যেও করতে পারেন:

var from = this.setStartTime(yourStartDateTime);
var to = this.setEndTime(yourEndDateTime);

yourFilter = yourFilter.And(f => f.YourDateTime.Value >= from && f.YourDateTime.Value <= to);

0

আপনি এনামের মতো পেতে পারেন:

DateTime todayDate = DateTime.Now.Date; var check = db.tableName.AsEnumerable().Select(x => new
        {
            Date = x.TodayDate.Date
        }).Where(x => x.Date == todayDate).FirstOrDefault();

তারিখের ফিল্টার প্রয়োগ করার জন্য এটি কার্যকরভাবে ছকটির পুরো বিষয়বস্তু গণ্য করা হচ্ছে ... সম্ভবত খুব খারাপ ধারণা বলে মনে হচ্ছে !
জাভিয়ার র‌্যাপার্পট

0

যেমনটি এখানে অনেকের দ্বারা চিহ্নিত করা হয়েছে, ট্র্যাঙ্কেকেটটাইম ফাংশনটি ধীরে ধীরে ব্যবহার করা।

EF কোর ব্যবহার করা সম্ভব হলে সবচেয়ে সহজ বিকল্প। এটি এটি করতে পারে। আপনি যদি না পারেন তবে কাটা কাটার আরও ভাল বিকল্প হ'ল কোয়েরি ফিল্ডটি একেবারে পরিবর্তন না করা, তবে সীমানা পরিবর্তন করা। আপনি যদি নীচের এবং উপরের সীমাগুলি alচ্ছিক যেখানে 'টাইপ ক্যোয়ারী' টাইপ করে থাকেন তবে নীচেরটি কৌশলটি করবে।

    public Expression<Func<PurchaseOrder, bool>> GetDateFilter(DateTime? StartDate, DateTime? EndDate)
    {
        var dtMinDate = (StartDate ?? SqlDateTime.MinValue.Value).Date;
        var dtMaxDate = (EndDate == null || EndDate.Value == SqlDateTime.MaxValue.Value) ? SqlDateTime.MaxValue.Value : EndDate.Value.Date.AddDays(1);
        return x => x.PoDate != null && x.PoDate.Value >= dtMinDate && x.PoDate.Value < dtMaxDate;
    }

মূলত, পিওডেটকে কেবল তারিখের অংশে ছাঁটাই না করে, আমরা উপরের ক্যোয়ারী বাউন্ড এবং ব্যবহারকারীকে <= পরিবর্তে <=

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