লিঙ্ক থেকে সত্তা ফ্রেমওয়ার্কের তারিখটাইম


108

আমার আবেদনে আমি সত্ত্বা ফ্রেমওয়ার্ক ব্যবহার করছি am

আমার টেবিল

-Article
-period
-startDate

আমার মেলে এমন রেকর্ডগুলি দরকার => DateTime.Now > startDate and (startDate + period) > DateTime.Now

আমি এই কোডটি চেষ্টা করেছিলাম তবে এটি এখন কাজ করছে

Context.Article
    .Where(p => p.StartDate < DateTime.Now)
    .Where(p => p.StartDate.AddDays(p.Period) > DateTime.Now)

আমি আমার কোডটি চালানোর সময় নিম্নলিখিত ব্যতিক্রমগুলি ঘটে

সত্তা থেকে লিনকিউ 'সিস্টেম.ডেটটাইম অ্যাডডেস (ডাবল)' পদ্ধতিটি স্বীকৃতি দেয় না এবং এই পদ্ধতির কোনও স্টোর এক্সপ্রেশনে অনুবাদ করা যায় না।


কি ধরণের period? AddDaysভুল ফাংশন যদি এটি হয় double
ক্রেগ স্টান্টজ

উত্তর:


201

লিনকিউ থেকে সত্তা ফ্রেমওয়ার্ক ব্যবহার করার সময়, যেখানে অনুচ্ছেদটি এসকিউএল তে অনুবাদ করা হবে তার ভিতরে আপনার পূর্বাভাস। আপনি সেই ত্রুটিটি পাচ্ছেন কারণ এসকিউএল-তে কোনও অনুবাদ নেই DateTime.Add()যার জন্য এটি বোঝা যায়।

একটি তাত্ক্ষণিক কাজ হ'ল প্রথম যেখানে স্টেটমেন্টের মেমোরিতে ফলাফলগুলি পড়ে এবং তারপরে ফিল্টারিং শেষ করতে অবজেক্টগুলিতে লিনকিউ ব্যবহার করা:

Context.Article.Where(p => p.StartDate < DateTime.Now)
               .ToList()
               .Where(p => p.StartDate.AddDays(p.Period) > DateTime.Now);

আপনি নেট নেট ব্যবহার করছেন, তবে আপনি অ্যান্টিটি ফাংশনসএডডেস পদ্ধতিতেও চেষ্টা করতে পারেন:

Context.Article.Where(p => p.StartDate < DateTime.Now)
               .Where(p => EntityFunctions.AddDays(p.StartDate, p.Period)
                   > DateTime.Now);

দ্রষ্টব্য: EF 6এটি এখন System.Data.Entity.DbFunctions.AddDays


42
এটি একটি বিপজ্জনক কাজ, যদি টোললিস্ট () বিপুল পরিমাণে ডেটা ফিরিয়ে দেয় তবে কী হবে?
স্টিফান পি।

7
অ্যান্টিটি ফাংশনস এর জন্য ধন্যবাদ। অ্যাডডয়েস টিপ আমি ইএফ। নেট 4.0 ব্যবহার করছি তবে এন্টি ফাংশন সম্পর্কে আমি জানতাম না, এটি সন্ধান করবে।
স্টেফান পি।

2
@ সাইদএলজি - প্রথম উদাহরণে আইটেমগুলিকে মেমরির মধ্যে পড়তে হবে। দ্বিতীয় উদাহরণে আমি দুটি ফর্মটি রেখেছি যেখানে মূল ফর্ম্যাটটি মেলে cla এমনকি আপনি যদি উভয়কে একক যেখানে ক্লজ, যেখানে সত্ত্বা ফ্রেমওয়ার্ক পরিচয় এসকিউএল তৈরি করে তাই এটি সত্যিই পঠনযোগ্যতার বিষয় হিসাবে সংকুচিত করে।
জাস্টিন নিসনার

2
@ জাস্টিন নিসনারকে অনেক ধন্যবাদ, আমি চেষ্টা করছি চার ঘন্টা ধরে আপনি আমার জীবন কয়েক সেকেন্ডে বাঁচাতে ধন্যবাদ আবার
ইউসেল

2
EF- এর সাথে "কুইক" ওয়ার্ক-এয়ার চার্জ দেওয়ার সময়, আমাদের সকলেরই ToList এবং ToArray পদ্ধতি ব্যবহার করা উচিত। আগের তারিখটি গণনা করা এবং সেই মানটির সাথে তুলনা করা ঠিক তত দ্রুত এবং এটি কোনও ফলাফলের জন্য মেমরিতে তাত্ক্ষণিক না করে কোনও EF কোয়েরিতে কাজ করে।
আইজাক ললোপিস

92

আমি মনে করি এটিই শেষ উত্তরটি পরামর্শ দেওয়ার চেষ্টা করছিল, তবে p.startdat (কিছু যা একটি বর্গাকার বিবৃতিতে রূপান্তর করা যায় না) এর জন্য কিছু দিন যুক্ত করার চেয়ে কেন কেন এমন কিছু করবেন না যা বর্গের সাথে সমান হতে পারে:

var baselineDate = DateTime.Now.AddHours(-24);

something.Where(p => p.startdate >= baselineDate)

2
@ অ্যাড্রিয়ান ক্যার - এই ব্যবহারের ক্ষেত্রে এটি EntityFunctionsসমাধানের পক্ষে যতটা সমাধান নয় তত ভাল । এখানে, দ্বিতীয় অপারেন্ড কোয়েরিতে অন্য সত্তা থেকে পুনরুদ্ধার করা হয়নি এবং অনুসন্ধানের আগে গণনা করা যেতে পারে। যদি উভয় অপরেন্ড ডিবিতে পাওয়া যায় তবে EntityFunctionsসমাধানটি এখনও যথাযথ হবে যদিও এই প্রতিক্রিয়ার সমাধানটি আর কাজ করবে না।
ফ্রেডেরিক

উত্তর হিসাবে চিহ্নিত সমাধানের চেয়ে এটি একটি ভাল সমাধান। জাস্টিন / চিহ্নিত উত্তর থেকে প্রাপ্ত প্রতিক্রিয়া ডাটাবেস থেকে অপ্রয়োজনীয় ফলাফল ফিরিয়ে দেবে। এই সমাধানটি আসলে এসকিউএল-এ সেই তারিখ প্রেরণ করে যেখানে ডেটা ফিল্টার করার জন্য এসকিউএল ফিল্টার করে এবং এটি আরও বেশি পারফরম্যান্ট।
পল

3

ডেটটাইম থেকে 2 দিন বিয়োগ সম্পর্কে কীভাবে.এখন:

Context.Article
.Where(p => p.StartDate < DateTime.Now)
.Where(p => p.StartDate > DateTime.Now.Subtract(new TimeSpan(2, 0, 0, 0)))

সত্যি কথা বলতে কী, আপনি কী অর্জন করতে চাইছেন তা আমি নিশ্চিত নই, তবে এটি কার্যকর হতে পারে


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

3

আপনার যদি প্রয়োজন হয় যে আপনার এক্সপ্রেশনটি এসকিউএলে অনুবাদ হয় তবে আপনি ব্যবহারের চেষ্টা করতে পারেন

System.Data.Entity.Core.Objects.AddDays পদ্ধতি ays

আসলে অপ্রচলিত হিসাবে চিহ্নিত হয়েছে তবে এটি কার্যকর হয় works এটি System.Data.Entity.DbFunitions.Addays দ্বারা প্রতিস্থাপন করা উচিত তবে আমি এটি খুঁজে পাই না ...


এটি 4 বছর আগের গ্রহণযোগ্য উত্তর ছাড়া আর কিছুই যুক্ত করে না!
অ্যান্ড্রু হ্যারিস

@ অ্যান্ড্রুহারিসও আমার উত্তরটি 4 বছর আগে উত্তর। উত্তরের প্রথম সংস্করণে যেখানে আগে (উত্তরের প্রথম মন্তব্য দেখুন) এর আগে একটি টোলিস্ট (=> ডেটা ম্যাটারিয়ালাইজেশন) ছিল।
বুবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.