লিনকিউ: ফিল্টারিংয়ের মানদণ্ডের সাথে সিঙ্গেলঅরডেফল্ট বনাম ফার্স্টওরডিফল্ট () কখন ব্যবহার করবেন


505

IEnumerable এক্সটেনশন পদ্ধতি SingleOrDefault()এবং বিবেচনা করুনFirstOrDefault()

এমএসডিএন নথি যাSingleOrDefault :

অনুক্রমের একমাত্র উপাদান বা ক্রমটি খালি থাকলে একটি ডিফল্ট মান প্রদান করে; অনুক্রমের একাধিক উপাদান থাকলে এই পদ্ধতিটি একটি ব্যতিক্রম ছুঁড়ে দেয়।

তবে FirstOrDefaultএমএসডিএন থেকে (সম্ভবত OrderBy()বা কখনই বা কিছু ব্যবহার OrderByDescending()না করে),

একটি অনুক্রমের প্রথম উপাদানটি প্রদান করে

মুষ্টিমেয় উদাহরণ কোয়েরি বিবেচনা করুন, কখন এই দুটি পদ্ধতি ব্যবহার করবেন তা সবসময় পরিষ্কার হয় না:

var someCust = db.Customers
.SingleOrDefault(c=>c.ID == 5); //unlikely(?) to be more than one, but technically COULD BE

var bobbyCust = db.Customers
.FirstOrDefault(c=>c.FirstName == "Bobby"); //clearly could be one or many, so use First?

var latestCust = db.Customers
.OrderByDescending(x=> x.CreatedOn)
.FirstOrDefault();//Single or First, or does it matter?

প্রশ্ন

তুমি কি নিয়মাবলী অনুসরণ বা সুপারিশ না যখন না ব্যবহার করার সিদ্ধান্ত নেওয়ার SingleOrDefault()এবং FirstOrDefault()আপনার LINQ ক্যোয়ারিগুলিতে?

উত্তর:


465

আপনি যখনই ব্যবহার করবেন SingleOrDefault, আপনি পরিষ্কারভাবে বলেছেন যে ক্যোয়ারির সর্বাধিক একক ফলাফল হওয়া উচিত । অন্যদিকে, যখন FirstOrDefaultব্যবহৃত হয়, ক্যোয়ারী যে কোনও পরিমাণের ফলাফল ফিরিয়ে দিতে পারে তবে আপনি উল্লেখ করেন যে আপনি কেবল প্রথমটি চান।

প্রত্যাশিত ফলাফলের উপর নির্ভর করে আমি ব্যক্তিগতভাবে শব্দার্থকগুলি খুব আলাদা এবং উপযুক্তটি ব্যবহার করে দেখতে পঠনযোগ্যতার উন্নতি করি।


164
একটি খুব গুরুত্বপূর্ণ পার্থক্য হ'ল যদি আপনি একাধিক উপাদানগুলির সাথে একটি সিক্যুয়ালে সিঙ্গেলঅরডিফল্ট ব্যবহার করেন তবে এটি একটি ব্যতিক্রম ছোঁড়ে।
কামরান বিগডেলি

17
@ কামি যদি এটির ব্যতিক্রম না ছড়ায় এটি হুবহু ফার্স্টআরডেফল্টের মতো হবে। ব্যতিক্রম হ'ল এটি সিঙ্গলঅরডিফল্ট করে তোলে। ভাল পয়েন্ট এটি আনয়ন, এবং পার্থক্যের কফিনে একটি পেরেক রাখে।
ফ্যাবিও এস।

17
আমার অবশ্যই বলতে হবে যে পারফরম্যান্স অনুসারে, ফার্স্টঅরডিফল্ট সিঙ্গেলঅরডিফল্টের চেয়ে প্রায় 10 গুণ বেশি দ্রুত কাজ করছে, 9,000,000 উপাদানগুলির একটি তালিকা <মাইক্লাস> ব্যবহার করে, শ্রেণিতে 2 টি পূর্ণসংখ্যা রয়েছে এবং ফানকটিতে এই দুটি পূর্ণসংখ্যার অনুসন্ধান রয়েছে। একটি লুপে 200 বার অনুসন্ধান করা var v = list- এ 22 সেকেন্ড সময় নিয়েছিল le সিঙ্গেলওরডিফল্ট (x => x.Id1 == i&& x.Id2 == i); এবং var v = list.FirstOrDefault (x => x.Id1 == i && x.Id2 == i); প্রায় 3 সেকেন্ড
চেন

6
@ বিটস্যান্ডবাইটস হ্যান্ডিয়াম্যান যদি সিক্যুয়ালটিতে একাধিক আইটেম থাকে তবে এটি ফার্স্টআরডেফল্টের মতো হুবহু আচরণ করবে না যদি সাইনলেঅরডেফল্ট ব্যতিক্রম না করে। ফার্স্টআরডিফল্ট প্রথম আইটেমটি ফেরত দেয়, বা ক্রমটি খালি থাকলে শূন্য হয়। সিঙ্গেলঅরডিফল্টকে কেবলমাত্র আইটেমটি ফেরত দেওয়া উচিত, বা ক্রমটি ফাঁকা থাকলে শূন্য করা উচিত বা এতে একাধিক আইটেম রয়েছে, কোনও ব্যতিক্রম ছাড়াই।
থানাসিস ইওনানিডিস

2
@ আরএসডাব্লু হ্যাঁ, আমি এটি সম্পর্কে সচেতন। আমার মন্তব্যটি মনোযোগ সহকারে পড়ছি, আমি বলছিলাম সিঙ্গলআরডিফল্টের কী করা উচিত, এটি কী করে না। তবে অবশ্যই এটি কী করা উচিত তা অত্যন্ত বিষয়গত j আমার জন্য, "সামথিংআরডিফল্ট" প্যাটার্নটির অর্থ: "কিছু" এর মান পান। "কিছু" যদি কোনও মান ফেরত দিতে ব্যর্থ হয় তবে ডিফল্ট মানটি ফিরিয়ে দিন। যার অর্থ হ'ল ডিফল্ট মানটি এমন ক্ষেত্রেও ফিরে আসা উচিত যেখানে "কিছু" ব্যতিক্রম ছুঁড়ে মারবে। সুতরাং, যেখানে সিঙ্গেল একটি ব্যতিক্রম ছুঁড়ে মারবে, সিঙ্গেলঅরডিফল্টকে আমার দৃষ্টিকোণে ডিফল্ট মানটি ফিরিয়ে দেওয়া উচিত।
থানাসিস আইওনানিডিস

585

যদি আপনার ফলাফল সেট 0 টি রেকর্ড দেয়:

  • SingleOrDefault প্রকারের জন্য ডিফল্ট মান প্রদান করে (উদাহরণস্বরূপ পূর্বনির্ধারার জন্য ডিফল্ট 0 হয়)
  • FirstOrDefault টাইপের জন্য ডিফল্ট মান প্রদান করে

যদি আপনি ফলাফল 1 টি রেকর্ড সেট করে:

  • SingleOrDefault যে রেকর্ড ফিরে
  • FirstOrDefault যে রেকর্ড ফিরে

যদি আপনার ফলাফল সেটটি অনেক রেকর্ড দেয়:

  • SingleOrDefault একটি ব্যতিক্রম নিক্ষেপ
  • FirstOrDefault প্রথম রেকর্ড দেয়

উপসংহার:

আপনি যদি ফলাফল সেটটিতে অনেকগুলি রেকর্ড থাকে তবে কোনও ব্যতিক্রম ছুঁড়ে ফেলতে চান SingleOrDefault

যদি আপনি সর্বদা 1 রেকর্ড চান তবে ফলাফল সেটটিতে যা আছে তা বিবেচনা না করেই ব্যবহার করুন FirstOrDefault


6
আমি পরামর্শ দিচ্ছি যে এটি ব্যতিক্রম আসলেই খুব কম দেখা যায় তাই বেশিরভাগ সময় ফার্স্টঅরডিফল্টকেই পছন্দ করা হয়। আমি জানি যে ঘটনাগুলি প্রায়শই ইমোতে থাকে না।
মাইককুলস

FirstOrDefaultপ্রথম রেকর্ড ফিরিয়ে দেওয়া মানে নতুন রেকর্ড (শেষ) / পুরানো রেকর্ড (প্রথম)? আপনি আমাকে পরিষ্কার করতে পারেন?
ডুক

@ ডুক, এটি কীভাবে আপনি রেকর্ডগুলি বাছাই করে তার উপর নির্ভর করে। আপনি ফার্স্টআরডিফল্ট কল করার আগে অর্ডারবাই () বা অর্ডারবাইডেসেন্ডিং () ইত্যাদি ব্যবহার করতে পারেন। ওপির কোড উদাহরণ দেখুন।
গণ

5
আমি এই উত্তরটিও পছন্দ করি। বিশেষত প্রদত্ত কিছু অনুষ্ঠান যেখানে আপনি প্রকৃতপক্ষে ব্যতিক্রম ছুঁড়ে ফেলতে চান তা হ'ল কারণ আপনি বিরল কেসটি সঠিকভাবে অন্য কোথাও হ্যান্ডেল করার ইচ্ছা করছেন ঠিক যেমনটি ঘটেছিল তা করার বিপরীতে। আপনি যখন ব্যতিক্রম চান তখন আপনি এটি স্পষ্টভাবে বলছেন, এবং অন্যদেরকে সামগ্রিক সিস্টেমটিকে আরও শক্তিশালী করার জন্য কেবল এনকেজ পরিচালনা করতে বাধ্য করছেন।
ফ্রান্সিস রজার্স

এটি খুব স্পষ্টভাবে বলা হয়েছে যাতে সহজেই বুঝতে পারে।
নীরভ ভোসোয়া

243

এখানে

  • একটি শব্দার্থগত পার্থক্য
  • একটি পারফরম্যান্স পার্থক্য

দুজনের মধ্যে

শব্দার্থগত পার্থক্য:

  • FirstOrDefault সম্ভাব্য একাধিকের প্রথম আইটেমটি ফেরত দেয় (বা যদি না থাকে তবে ডিফল্ট)।
  • SingleOrDefaultধরে নেওয়া যায় যে একটি একক আইটেম রয়েছে এবং এটি প্রদান করে (বা কোনওটি উপস্থিত না থাকলে ডিফল্ট)। একাধিক আইটেম চুক্তি লঙ্ঘন, একটি ব্যতিক্রম নিক্ষেপ করা হয়।

পারফরম্যান্স পার্থক্য

  • FirstOrDefaultসাধারণত দ্রুত হয়, এটি উপাদানটি না পাওয়া পর্যন্ত এটি পুনরুক্ত হয় এবং এটি যখন এটি খুঁজে না পায় কেবল তখন পুরো পরিগণিতকে পুনরাবৃত্তি করতে হয়। অনেক ক্ষেত্রে, কোনও আইটেম সন্ধানের উচ্চ সম্ভাবনা রয়েছে।

  • SingleOrDefaultশুধুমাত্র একটি উপাদান রয়েছে কিনা তা যাচাই করা দরকার এবং সেইজন্য সর্বদা সম্পূর্ণ গণনার পুনরুক্তি করা উচিত। সুনির্দিষ্টভাবে বলতে গেলে এটি পুনরুক্ত হয় যতক্ষণ না এটি একটি দ্বিতীয় উপাদান খুঁজে পায় এবং একটি ব্যতিক্রম ছুঁড়ে ফেলে। তবে বেশিরভাগ ক্ষেত্রে দ্বিতীয় উপাদান নেই।

উপসংহার

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

  • আপনার SingleOrDefaultযদি পারফরম্যান্স সম্পর্কে খুব বেশি যত্ন নিতে না হয় এবং একক আইটেমের অনুমান পাঠকের কাছে পরিষ্কার হয়ে যায় এবং রানটাইমে পরীক্ষা করা হয় তা নিশ্চিত করতে চাইলে ব্যবহার করুন।

অনুশীলনে, আপনি যখন আপনি কোনও একক আইটেম গ্রহণ করেন তখন First/ FirstOrDefaultপ্রায়শই এমন ক্ষেত্রে ব্যবহার করেন, কর্মক্ষমতা উন্নত করতে। আপনার এখনও মনে রাখা উচিত Single/ SingleOrDefaultপাঠযোগ্যতার উন্নতি করতে পারে (কারণ এটি একক আইটেমের অনুমিতি বর্ণনা করে) এবং স্থায়িত্ব (কারণ এটি এটি পরীক্ষা করে) এবং এটি যথাযথভাবে ব্যবহার করে।


16
+1 "বা যখন আপনি স্বতন্ত্রতা পরীক্ষা করার সামর্থ্য রাখেন না (যেমন একটি খুব বড় সংগ্রহের মধ্যে)।" । আমি এটা খুঁজছিলাম। আমি সন্নিবেশ করার সময়, বা / এবং কোয়েরি করার পরিবর্তে ডিজাইন দ্বারা স্বতন্ত্রতা প্রয়োগ করব !
নওয়াজ

SingleOrDefaultলিনক টু অবজেক্টস ব্যবহার করার সময় আমি অনেকগুলি অবজেক্টের উপর পুনরাবৃত্তি কল্পনা করতে পারি , তবে SingleOrDefaultলিনক উদাহরণস্বরূপ যদি একটি ডাটাবেসের সাথে কথা বলছে তবে সর্বাধিক 2 টি আইটেমের উপরে পুনরাবৃত্তি করতে হবে না ? শুধু ভাবছি ..
মেমেট ওলসেন

3
@ মমেটলসন লিনকিউ থেকে এসকিউএল দিয়ে দুটির জন্য কোড স্পিটটি বিবেচনা করুন - ফার্স্টঅরডেফল্ট শীর্ষস্থানীয় 1 ব্যবহার করে Sing সিঙ্গেলঅরডাফল্ট শীর্ষ 2 ব্যবহার করে
জিম

@ জিমউলি আমার ধারণা আমি 'গণনাযোগ্য' শব্দটি ভুল বুঝেছি। আমি ভেবেছিলাম স্টিফান মানে সি # Enumerable
মেমেট ওলসেন

1
@ মমেটলসেন মূল উত্তরের ক্ষেত্রে সঠিক, আপনার মন্তব্যটি ডেটাবেসকে উল্লেখ করেছে, তাই আমি সরবরাহকারীর কাছ থেকে যা ঘটে তা দিচ্ছিলাম। নেট নেট কোডটি কেবলমাত্র 2 টির উপরে পুনরাবৃত্তি করে, দ্বিতীয়টি মানদণ্ডের সাথে মিল না হওয়া পর্যন্ত ডাটাবেসটি যতটা রেকর্ডের প্রয়োজন তা পরিদর্শন করে।
জিম উলি

76

কেউ উল্লেখ করেন নি যে এসকিউএল ভাষায় অনুবাদ করা ফার্স্টঅরডেফল্ট শীর্ষস্থানীয় রেকর্ডটি করে 1, এবং সিঙ্গেলঅরডেফল্ট শীর্ষস্থানীয় 2 করেছে, কারণ এটি জানতে হবে যে সেখানে 1 টিরও বেশি রেকর্ড রয়েছে।


3
আমি যখন লিনকপ্যাড এবং ভিএস-এর মাধ্যমে সিঙ্গেলঅরডিফল্ট চালিয়েছি, আমি কখনই প্রথম নির্বাচন 2 পেলাম না, ফার্স্টআরডাফল্টের সাথে আমিও নির্বাচন সেরা 1 পেতে সক্ষম হয়েছি, তবে যতদূর আমি বলতে পারি যে আপনি নির্বাচিত শীর্ষ 2 পাচ্ছেন না
জ্যামি আর রাইটেলউস্কি

আরে আমাকে লিনকপ্যাডেও চেষ্টা করা হয়েছে এবং এসকিএল কোয়েরি আমাকে ভয় পেয়েছিল কারণ এটি সমস্ত সারি সম্পূর্ণরূপে এনেছে। আমি নিশ্চিত না কীভাবে এটি ঘটতে পারে?
যেকোনও

1
এটি সম্পূর্ণ ব্যবহৃত লিনকিউ সরবরাহকারীর উপর নির্ভর করে। উদাহরণস্বরূপ, লিনকিউ থেকে এসকিউএল এবং লিনকিউ থেকে সত্তাগুলি এসকিউএলকে বিভিন্ন উপায়ে অনুবাদ করতে পারে। আমি আইকিউ মাইএসকিএল সরবরাহকারীর সাথে লিনিকপ্যাড চেষ্টা করেছি এবং কিছুই FirstOrDefault()যোগ করার LIMIT 0,1সময় SingleOrDefault()যুক্ত করেছি।
লুকাস

1
ইএফ কোর ২.১ ফার্স্টঅরডাফল্টকে সিলেক্ট টপ (১), সিঙ্গেলঅরডাফল্টকে সিলেক্ট টপ (২)
সিএমইঙ্ক

19

লিনকিউ -> এসকিউএল এর জন্য:

SingleOrDefault

  • "ইউজারিড = 1" এমন ব্যবহারকারীদের কাছ থেকে "নির্বাচন করুন" এর মতো কোয়েরি তৈরি করবে
  • মিলের রেকর্ড নির্বাচন করুন, একাধিক রেকর্ড পাওয়া গেলে ব্যতিক্রম ছুঁড়ে
  • আপনি যদি প্রাথমিক / অনন্য কী কলামের উপর ভিত্তি করে ডেটা আনছেন তবে ব্যবহার করুন

FirstOrDefault

  • "ব্যবহারকারীদের যেখানে শীর্ষস্থানীয় 1 * নির্বাচন করুন যেখানে ইউজারিড = 1" এর মতো কোয়েরি তৈরি করবে
  • প্রথম মিলের সারিগুলি নির্বাচন করুন
  • আপনি অ প্রাথমিক / অনন্য কী কলামের ভিত্তিতে ডেটা আনছেন তা ব্যবহার করুন

আমি মনে করি আপনার সিঙ্গলঅরডেফল্ট থেকে "সমস্ত মিলের সারিগুলি নির্বাচন করুন" সরিয়ে নেওয়া উচিত
সাইম আবদুল্লাহ

10

আমি SingleOrDefaultএমন পরিস্থিতিতে ব্যবহার করি যেখানে আমার যুক্তি নির্দেশ করে যে either হয় শূন্য বা একটি ফলাফল। যদি আরও কিছু থাকে তবে এটি একটি ত্রুটির পরিস্থিতি, যা সহায়ক।


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

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

5

সিঙ্গলঅরডিফল্ট: আপনি বলছেন যে "সর্বাধিক" কোয়েরির সাথে ডিফল্ট বা ডিফল্টের সাথে মেলে একটি আইটেম ফার্স্টঅরডিফল্ট: আপনি বলছেন যে ক্যোয়ারী বা ডিফল্টের সাথে মিলে "কমপক্ষে" একটি আইটেম রয়েছে

পরের বার যখন আপনাকে চয়ন করা দরকার উচ্চস্বরে বলুন এবং আপনি সম্ভবত বুদ্ধিমানের সাথে চয়ন করবেন। :)


5
প্রকৃতপক্ষে কোনও ফলাফল না পাওয়া FirstOrDefault. More correctly: ফার্স্টআরডেফল্ট = এর কোনওরকম গ্রহণযোগ্য ব্যবহার তবে আমি কেবলমাত্র প্রথমটিকেই যত্নবান করি, ফলাফলও নাও হতে পারে। SingleOrDefault= 1 বা 0 টি ফলাফল রয়েছে, যদি এর বেশি থাকে তবে এর অর্থ কোথাও একটি ত্রুটি রয়েছে। First= কমপক্ষে একটি ফলাফল রয়েছে এবং আমি এটি চাই। Single= ঠিক 1 ফলাফল আছে, আর নেই, কম নেই, এবং আমি এটি চাই।
ডেভি

4

আপনার ক্ষেত্রে, আমি নিম্নলিখিত ব্যবহার করব:

আইডি == 5 দ্বারা নির্বাচন করুন: এখানে একা ওড়ডাফল্টটি ব্যবহার করা ঠিক আছে, কারণ আপনি যদি একটি আইডি 5 সহ একাধিক সত্তা পেয়ে থাকেন তবে আপনি অবশ্যই একটি [বা কোনও নয়] সত্তার প্রত্যাশা করছেন, অবশ্যই কিছু ভুল এবং স্পষ্টতই ব্যতিক্রম যোগ্য।

যাদের প্রথম নামটি "ববি" এর সমান হয় তাদের সন্ধান করার জন্য, একাধিক থাকতে পারে (সম্ভবত আমি মনে করি), সুতরাং আপনার একক বা প্রথম ব্যবহার করা উচিত নয়, কেবল যেখানে-অপারেশন দিয়ে নির্বাচন করুন (যদি "ববি" খুব বেশি ফেরত দেয়) সত্তা, ব্যবহারকারীকে তার অনুসন্ধানটি পরিমার্জন করতে হবে বা ফিরে আসা ফলাফলগুলির মধ্যে একটি বেছে নিতে হবে)

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


3
আমি একমত নই যদি আপনার ডাটাবেস আইডি একটি প্রাথমিক কী হয়, তবে ডাটাবেসটি ইতিমধ্যে স্বতন্ত্রতা প্রয়োগ করছে। প্রতিটি ক্যোয়ারীতে ডাটাবেস তার কাজ করছে কিনা তা পরীক্ষা করতে সিপিইউ চক্র নষ্ট করছে just
জন হেন্কেল

4

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

List<int> items = new List<int>() {9,10,9};
//Returns the first element of a sequence after satisfied the condition more than one elements
int result1 = items.Where(item => item == 9).FirstOrDefault();
//Throw the exception after satisfied the condition more than one elements
int result3 = items.Where(item => item == 9).SingleOrDefault();

2
"তাদের মধ্যে একটি সামান্য পার্থক্য আছে" - এটি প্রধান!
নিখিল वर्तক

3

আপনার শেষ উদাহরণে:

var latestCust = db.Customers
.OrderByDescending(x=> x.CreatedOn)
.FirstOrDefault();//Single or First, or doesn't matter?

হ্যাঁ এটা করে. আপনি যদি ব্যবহার করার চেষ্টা করেন SingleOrDefault()এবং ক্যোয়ারী ফলাফলের চেয়ে বেশি রেকর্ডে আসে তবে আপনি ব্যতিক্রম পাবেন। SingleOrDefault()আপনি কেবলমাত্র 1 টি এবং কেবল 1 ফলাফল প্রত্যাশা করলে আপনি কেবলমাত্র নিরাপদে ব্যবহার করতে পারবেন ...


এটাই সঠিক. আপনি যদি 0 ফলাফল পান তবে আপনি একটি ব্যতিক্রমও পাবেন।
ডেনিস রঙ্গো

1

আমি যেমন এখন বুঝতে পারি, SingleOrDefault ভাল হবে যদি আপনি এমন ডেটার জন্য অন্বেষণ করেন যা প্রাথমিক কী এর মতো ডিবি সীমাবদ্ধতা দ্বারা কার্যকর করা হয় unique

বা প্রাথমিক কীটির জন্য আরও ভাল জিজ্ঞাসা করার উপায় রয়েছে।

ধরে নিচ্ছি আমার টেবিলএসি রয়েছে

AccountNumber - Primary Key, integer
AccountName
AccountOpenedDate
AccountIsActive
etc.

এবং আমি কোনওটির জন্য জিজ্ঞাসা করতে চাই AccountNumber 987654, আমি ব্যবহার করি

var data = datacontext.TableAcc.FirstOrDefault(obj => obj.AccountNumber == 987654);

1

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


-1

প্রতিক্রিয়াগুলিতে মিস করা একটি জিনিস ....

যদি একাধিক ফলাফল থাকে, তবে কোনও আদেশ ছাড়াই ফার্স্টআরডিফল্ট বিভিন্ন ফলাফল ফিরিয়ে আনতে পারে যার ভিত্তিতে সার্ভারের মাধ্যমে সূচী কৌশলটি কখনও ব্যবহার করা হয়েছে।

ব্যক্তিগতভাবে আমি কোডে ফার্স্টআরডিফল্ট দেখে দাঁড়াতে পারি না কারণ আমার কাছে এটি বলে যে বিকাশকারী ফলাফলের বিষয়ে চিন্তা করেন না। কোনও অর্ডার সহ যদিও এটি সর্বশেষতম / প্রাচীনতম প্রয়োগের উপায় হিসাবে কার্যকর হতে পারে। আমাকে ফার্স্টআরডিফল্ট ব্যবহার করে অযত্ন বিকাশকারীদের দ্বারা সৃষ্ট প্রচুর সমস্যা সমাধান করতে হয়েছিল।


-2

গিটহাবের বিভিন্ন পদ্ধতি ব্যবহারের জন্য আমি গুগলকে জিজ্ঞাসা করেছি। এটি প্রতিটি পদ্ধতির জন্য গুগল অনুসন্ধান কোয়েরি চালিয়ে এবং "সাইট: github.com ফাইল: সিএস ..." কোয়েরিটি ব্যবহার করে গিথুব.কম ডোমেন এবং .cs ফাইল এক্সটেনশনে কোয়েরি সীমাবদ্ধ করে করা হয় is

মনে হয় সিঙ্গল * পদ্ধতির চেয়ে প্রথম * পদ্ধতিগুলি বেশি ব্যবহৃত হয়।

| Method               | Results |
|----------------------|---------|
| FirstAsync           |     315 |
| SingleAsync          |     166 |
| FirstOrDefaultAsync  |     357 |
| SingleOrDefaultAsync |     237 |
| FirstOrDefault       |   17400 |
| SingleOrDefault      |    2950 |

-8

আপনি FirstOrDefault(x=> x.ID == key)যখন ব্যবহার করছেন তখন আপনি কেন ব্যবহার করছেন ফলাফলগুলি আরও দ্রুত পুনরুদ্ধার করতে পারে তা আমি বুঝতে পারি না Find(key)। আপনি যদি টেবিলের প্রাথমিক কীটি নিয়ে জিজ্ঞাসাবাদ করছেন তবে থাম্বের নিয়মটি সর্বদা ব্যবহার করা উচিত Find(key)FirstOrDefaultপ্রাকটিক স্টাফ (x=> x.Username == username)ইত্যাদির জন্য ব্যবহার করা উচিত

এটি ডাউনওয়েটের যোগ্য নয় কারণ প্রশ্নের শিরোনামটি ডিবি বা লিনক থেকে তালিকা / আইমনামেবল ইত্যাদিতে লিনাকের জন্য নির্দিষ্ট ছিল না


1
কোন নেমস্পেসে Find()আছে?
পি.কম্পবেল

দয়া করে আমাদের বলতে পারেন? এখনও একটি উত্তরের জন্য অপেক্ষা।
ডেনি


"আইইনুমারেবল" শব্দটি প্রশ্নবোধের একেবারে প্রথম লাইনে রয়েছে। আপনি যদি কেবল শিরোনামটি পড়েন এবং আসল প্রশ্নটি না পড়ে এবং ফলস্বরূপ একটি ভুল উত্তর পোস্ট করেন তবে এটি আপনার ভুল এবং আইএমওকে হ্রাস করার উপযুক্ত বৈধ কারণ।
এফ 1 ক্রাজি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.