সত্তা ফ্রেমওয়ার্ক 4 একক () বনাম ফার্স্ট () বনাম ফার্স্টআরডিফল্ট ()


119

একক আইটেমের জন্য জিজ্ঞাসা করার বিভিন্ন উপায়ে এবং কখন ব্যবহার করতে হবে তা নিয়ে আমার তুলনা খুঁজে পাওয়া সময়ের এক শয়তান রয়েছে।

কারওর সাথে কি এমন কোনও লিঙ্ক রয়েছে যা এই সমস্তগুলির সাথে তুলনা করে, বা আপনি কেন একে অপরকে ব্যবহার করবেন তা সম্পর্কে একটি দ্রুত ব্যাখ্যা? এখনও কি আরও অপারেটর রয়েছে যা সম্পর্কে আমি অজানা?

ধন্যবাদ.

উত্তর:


205

এখানে বিভিন্ন পদ্ধতির একটি ওভারভিউ দেওয়া হল:

  • () সন্ধান করুন - যখন আপনি প্রাথমিক কী দ্বারা কোনও আইটেম পেতে চান। এটি কোনও আইটেম না পেলে এটি শূন্য হবে। এটি ডাটাবেসে যাওয়ার আগে প্রেক্ষাপটে সন্ধান করবে (মন্তব্যগুলিতে ইয়ারনের নির্দেশ অনুসারে) যা একই প্রাসঙ্গিক জীবিত থাকাকালীন যদি আপনাকে একই সত্তা একাধিকবার পাওয়ার প্রয়োজন হয় তবে এটি একটি গুরুত্বপূর্ণ দক্ষতার কারণ হতে পারে।

  • একক () - যখন আপনি কোনও ক্যোয়ারী দ্বারা ঠিক একটি আইটেম ফেরত প্রত্যাশা করবেন। কোয়েরিটি যদি ঠিক একটি আইটেম না ফেরায় তবে এটি ব্যতিক্রম করবে an

  • সিঙ্গেলঅরডিফল্ট () - যখন আপনি শূন্য বা একটি আইটেম কোনও ক্যোয়ারির মাধ্যমে ফেরত প্রত্যাশা করবেন (যেমন আপনি প্রদত্ত কী সহ কোনও আইটেম উপস্থিত আছে কিনা তা নিশ্চিত নন)। যদি ক্যোয়ারী শূন্য বা একটি আইটেম না ফেরায় তবে এটি ব্যতিক্রম করবে।

  • প্রথম () - যখন আপনি এক বা একাধিক আইটেম কোনও ক্যোয়ারির মাধ্যমে প্রত্যাবর্তনের প্রত্যাশা করেন তবে আপনি কেবল আপনার কোডের প্রথম আইটেমটি অ্যাক্সেস করতে চান (ক্রমটি এখানে কোয়েরিতে গুরুত্বপূর্ণ হতে পারে)। যদি কোয়েরি কমপক্ষে একটি আইটেম ফেরত না দেয় তবে এটি একটি ব্যতিক্রম ছুঁড়ে দেবে।

  • ফার্স্টআরডিফল্ট () - যখন আপনি শূন্য বা আরও বেশি আইটেম কোনও ক্যোয়ারির মাধ্যমে প্রত্যাবর্তনের প্রত্যাশা করেন তবে আপনি কেবল আপনার কোডের প্রথম আইটেমটি অ্যাক্সেস করতে চান (যেমন আপনি কোনও নিশ্চিত কী সহ কোনও আইটেম উপস্থিত আছেন কিনা তা নিশ্চিত নন)


1
এটি দৃশ্যের উপর নির্ভর করে। যদি আপনি জানেন যে আপনার সর্বদা ডিবি থেকে একটি একক রেকর্ড ফিরে পাওয়া উচিত, কোনও প্রদত্ত প্রশ্নের জন্য আর কিছু না, কম নয়, তবে সিঙ্গল () হ'ল 'ডান' ব্যবহার করা উচিত। অন্যান্য পরিস্থিতিতে অন্যরা আরও উপযুক্ত হতে পারে। EF এর পূর্ববর্তী সংস্করণগুলিতে আমরা প্রথম () এবং ফার্স্টআরডিফল্ট () এর মধ্যে সীমাবদ্ধ ছিলাম যেখানে আপনি একক রেকর্ডের প্রত্যাশা করছেন এমন দৃশ্যের জন্য কাজ করে তবে তারা আপনাকে সতর্ক করতে পারবে না যদি আপনি সেই একক রেকর্ডের চেয়ে বেশি ফিরে পান যা নির্ভর করে গুরুত্বপূর্ণ হতে পারে পরিস্থিতি.
স্টিভ উইলকক

1
ধন্যবাদ। আমি নিজেকে আর প্রথমে () এর দরকার দেখতে পাচ্ছি না, যেখানে সিঙ্গেল () এর চেয়ে ভাল হবে না। আমি যদি কম ঘন হয়ে থাকি তবে আমি নিশ্চিত যে আমি এখনও প্রথম () ব্যবহার করার সময় প্রশংসা করতে / বুঝতে পারি।
asfsadf

1
প্রথমে () সেক্ষেত্রে সর্বাধিক বোধগম্য হয় যেখানে আপনি যেটি অর্ডার করছেন তার সর্বোচ্চ বা সর্বনিম্ন সহ কেবলমাত্র অবজেক্টটি পুনরুদ্ধার করতে চান। উদাহরণস্বরূপ, সর্বাধিক মোট মান সহ আমাকে বিক্রয়টি সন্ধান করুন। Sales.OrderByDescending(s => s.TotalValue).First();
মাইক চেম্বারলাইন

5
সমস্ত মন্তব্য একটি গুরুত্বপূর্ণ পার্থক্য চেহারা। অনুসন্ধান () হ'ল একমাত্র পদ্ধতি যা ডিবিতে আঘাতের আগে প্রসঙ্গটি অনুসন্ধান করে।
ইয়ারন লেভি

5
আরেকটি বিষয় হ'ল কোনও স্কল ডাটাবেস জিজ্ঞাসা করার সময়, Singleবা SingleOrDefault2 টি রেকর্ড (সীমা 2) জিজ্ঞাসা করবে Firstবা FirstOrDefault1 (সীমা 1) এর জন্য জিজ্ঞাসা করবে।
বার্ট ক্যালিক্স্টো

22

আমি সবসময় ব্যবহার করতে ঝোঁক FirstOrDefault। আপনি যদি সত্যিই পারফরম্যান্সের সাথে পিক হতে চান তবে আপনার FirstOrDefaultEF এ ব্যবহার করা উচিত । কভারগুলির নীচে SingleOrDefaultক্যোয়ারিতে শীর্ষ (2) ব্যবহার করে কারণ, এটি পরীক্ষা করে দেখা দরকার যে সেখানে কোনও দ্বিতীয় সারির মানদণ্ডের সাথে মেলে কিনা এবং যদি এটি হয়, এটি একটি ব্যতিক্রম ছুঁড়ে। মূলত SingleOrDefaultআপনি বলছেন যে আপনার ক্যোয়ারী যদি আরও 1 টি রেকর্ড ফেরত দেয় তবে আপনি একটি ব্যতিক্রম ছুঁড়ে দিতে চান।


5
আপনি কি মাঝে মাঝে পারফরম্যান্স পার্থক্যটি পরিমাপ করেছেন FirstOrDefaultএবং SingleOrDefaultতা উল্লেখযোগ্য? আমি বলব এটি বেশিরভাগ ক্ষেত্রে অকাল অপটিমাইজেশন।
স্টিভেন

আমি ব্যবহারের প্রবণতা Single()বা SingleOrDefault()যখন আমি যার কিছু আসতে সেখানে উচিত শুধুমাত্র অস্তিত্ব এক । আমি এর কারণটি হ'ল খারাপভাবে লিখিত প্রশ্ন তৈরি করে ত্রুটিগুলি খুঁজে পাওয়া যায় যা ব্যর্থ হওয়া উচিত তাদের চেয়ে বেশি ফিরিয়ে দেয়। কমপক্ষে আমার মনে, এটি সিস্টেমে ডেটা সামঞ্জস্য রাখতে সহায়তা করবে। অবশ্যই এটি ধীর, তবে আমি অনুমান করব যে এটি খুব ধীর নয় এবং আমি সেই মূল্য দিতে রাজি।
মার্টব

15

এটি সত্যিই খুব সহজ: Singleকোনও একক আইটেমকে ফেরত দেয় এবং একাধিক আইটেম না থাকলে বা বাদ দেয় throw Firstকোনও আইটেম না থাকলে প্রথম আইটেমটি ফিরবে বা নিক্ষেপ করবে। FirstOrDefaultকোনও আইটেম না থাকলে প্রথম আইটেমটি ফিরিয়ে আনবে বা ডিফল্ট মান (যা nullপ্রদত্ত প্রকারটি একটি রেফারেন্স ধরণের ক্ষেত্রে হয়) ফিরিয়ে দেবে ।

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


ধন্যবাদ স্টিভন আমার ধারণা আমি এখনও ভাবছি আপনি কেন একে অপরকে ব্যবহার করবেন? আমি সর্বদা ফার্স্টআরডিফল্ট () ব্যবহার করেছি এবং আমি কৌতূহল বোধ করছিলাম যে আমি যে নতুন নতুন উদাহরণ দেখেছি সেগুলি কেন সিঙ্গল () এ বদলেছে। একা () এ স্যুইচ করার কোনও কারণ আছে কি? অন্যদেরও কি একই জিনিস সম্পাদন করা হয়, যা আমার পরিবর্তে বিবেচনা করা উচিত?
asfsadf

7
আপনি যদি আপনার
কোডটিকে

3
আমি ফ্র্যাঙ্কের সাথে পুরোপুরি একমত এটি অভিপ্রায়টি যোগাযোগের বিষয়েও। Singleপরিষ্কারভাবে প্রকাশ করে যে আপনি ফলাফলটি কেবলমাত্র একটি উপাদান হিসাবে প্রত্যাশা করছেন।
স্টিভেন

8

চারটি পদ্ধতির প্রত্যেকের নিজস্ব জায়গা রয়েছে; যদিও আপনার কাছে কেবল দুটি ভিন্ন অপারেশন রয়েছে।

  • প্রথম - একাধিক আইটেম রয়েছে এমন একটি ফলাফলের সেটটি আশা করা, আমাকে সেটে প্রথম আইটেমটি দিন।
  • একক - একক ফলাফলের প্রত্যাশা ফিরে, আমাকে সেই আইটেমটি দিন।

এক্সএক্সএক্সএক্সএক্সআরডিফল্ট () সংস্করণটি কেবলমাত্র যুক্ত করেছে "আমি একটি খালি ফলাফল সেটটিকে ব্যতিক্রমী পরিস্থিতি হিসাবে বিবেচনা করতে চাই না।"


ঠিক আছে, সুতরাং আমার কাছে মনে হয় ফার্স্ট () খুব কমই কাজে আসবে। আমি এমন দৃশ্যের মুখোমুখি হচ্ছি যেখানে সিঙ্গেল () প্রথম বিকল্প নয়। আপনার কি এক দ্রুত এক হাত বন্ধ আছে? ধন্যবাদ।
asfsadf

3
দুর্ভাগ্যক্রমে অনেক বিকাশকারীরা প্রথম () বা ফার্স্টআরডিফল্ট () কে সম্পূর্ণরূপে একটি প্রতিরক্ষামূলক ব্যবস্থা হিসাবে ব্যবহার করে, ভেবে ভেবে যে এটি সত্যিকারের সমস্যাগুলি আড়াল করার সম্ভাবনা কেবল তখনই একটি ব্যতিক্রম এড়াতে পারে।
ম্যাট এইচ

3

অন্যদিকে, আপনি মূল যুক্তিকে এই পদ্ধতিগুলি ভাগ করতে পারেন:

  • পদ্ধতিটি সরাসরি ডেটাবেসকে জিজ্ঞাসা করবে : একক (), সিঙ্গেলঅরডিফল্ট (), প্রথম (), ফার্স্টঅরডিফল্ট ()
  • ডাটাবেসের বিরুদ্ধে ক্যোয়ারী দেওয়ার আগেও পদ্ধতি ক্যাশে একটি অনুসন্ধান করবে : সন্ধান করুন ()

কিছু পারফরম্যান্সের বিশদের জন্য, বিশেষত দ্বিতীয় ক্ষেত্রে আপনি এখানে দেখতে পারেন: https://msdn.microsoft.com/en-us/data/hh949853.aspx?f=255&MSPPError=-2147217396#3

এছাড়াও, প্রথম গোষ্ঠীতে আপনি জটিল প্রশ্নগুলি সংজ্ঞায়িত করতে পারেন তবে ফাইন্ড () পদ্ধতিতে আপনি অনুসন্ধানের জন্য কেবল সত্তা কী সরবরাহ করতে পারেন।


0

সিঙ্গেল () এবং সিঙ্গলঅরডিফল্ট () সাধারণত আইডির মতো অনন্য শনাক্তকারীগুলিতে ব্যবহৃত হয়, যখন প্রথম () বা ফার্স্টআরডিফল্ট () সাধারণত একটি প্রশ্নের জন্য ব্যবহৃত হয় যার একাধিক ফলাফল হতে পারে তবে আপনি কেবল "শীর্ষস্থানীয় 1" চান

কোনও ফলাফল না পেলে একক () বা প্রথম () একটি ব্যতিক্রম ছুঁড়ে মারবে , সিঙ্গেলঅরডেফল্ট () এবং ফার্স্টঅরডিফল্ট () ব্যতিক্রমটি ধরে এবং নাল বা ডিফল্ট (রেজাল্টডাটাটাইপ) প্রদান করে।

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