খালি ক্যোয়ারী হলে সর্বাধিক ফেরতের মান


175

আমার এই প্রশ্নটি রয়েছে:

int maxShoeSize = Workers
    .Where(x => x.CompanyId == 8)
    .Max(x => x.ShoeSize);

maxShoeSize8 কোম্পানির কোনও কর্মী না থাকলে কী হবে ?

আপডেট:
0 এবং ব্যতিক্রম না পেতে আমি কীভাবে ক্যোয়ারী পরিবর্তন করতে পারি?


নাওর: আপনি লিনকিউপ্যাডের কথা শুনেছেন?
মিচ গম

3
বুঝতে পারছি না আপনি কেন জিজ্ঞাসা করবেন 'কী হবে maxShoeSize?' যদি আপনি ইতিমধ্যে এটি ব্যবহার করে থাকেন।
jwg

@jwg: আমি অনুমান করি যে আপনি উত্তরটি জানেন কিনা তা আমি দেখতে চেয়েছিলাম :) অবশেষে আমি যা বলেছি তা করার আরও একটি ভাল উপায় পেয়েছি এবং এটিই আমার অর্থ।
নাওর

@ নাওর, এটি অনুমান করার মতো খেলা নয়। আমিও মূল প্রশ্নটিকে নীচে নামিয়ে দেব। উত্তরটি যদি আপনি জানেন তবে তা আমাদেরকে দিন অন্যথায় আপনি অলস দেখায়। ঠিক এখন আমি একই প্রশ্নটি করতে যাচ্ছিলাম এবং আমি ব্যতিক্রম বার্তা সহ সমস্ত তথ্য প্রস্তুত করি।
হুয়ান কার্লোস ওরোপেজা

উত্তর:


298
int maxShoeSize = Workers.Where(x => x.CompanyId == 8)
                         .Select(x => x.ShoeSize)
                         .DefaultIfEmpty(0)
                         .Max();

শূন্য ইন DefaultIfEmptyপ্রয়োজন হয় না।


ওয়ার্কস :) তবে আমার কোডে ডিফল্টআইফেম্পটির শূন্য প্রয়োজনীয় ছিল।
কার্লোস টেনরিও পেরেজ

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

59

আমি জানি এটি একটি পুরানো প্রশ্ন এবং স্বীকৃত উত্তরটি কাজ করে, তবে এই প্রশ্নটি আমার প্রশ্নের উত্তর দিয়েছে যে এই ধরনের খালি সেটটি ব্যতিক্রম বা ফলাফলের ফলস্বরূপ হবে কিনা default(int)

গৃহীত উত্তরটি যদিও এটি কাজ করে, আদর্শ সমাধান আইএমএইচও নয়, যা এখানে দেওয়া হয়নি। যে কেউ এটি সন্ধান করছে তার সুবিধার জন্য আমি এটি আমার নিজের উত্তরে সরবরাহ করছি।

ওপির মূল কোডটি ছিল:

int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSize);

ব্যতিক্রমগুলি রোধ করতে এবং একটি ডিফল্ট ফলাফল সরবরাহ করার জন্য আমি এটি এইভাবে লিখব:

int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max(x => x.ShoeSize as int?) ?? 0;

এটি Maxফাংশনটির রিটার্নের ধরণের কারণ হয়ে যায় int?, যা nullফলাফলকে অনুমতি দেয় এবং তারপরে ফলাফলটি ??প্রতিস্থাপন করে । null0


সম্পাদনা
করুন মন্তব্য থেকে কিছু স্পষ্ট করার জন্য, সত্তা ফ্রেমওয়ার্ক বর্তমানে asকীওয়ার্ডটি সমর্থন করে না , সুতরাং EF এর সাথে কাজ করার সময় এটি লেখার উপায়টি হ'ল:

int maxShoeSize = Workers.Where(x => x.CompanyId == 8).Max<[TypeOfWorkers], int?>(x => x.ShoeSize) ?? 0;

যেহেতু এটি [TypeOfWorkers]একটি দীর্ঘ শ্রেণীর নাম হতে পারে এবং লেখার জন্য ক্লান্তিকর তাই আমি সাহায্য করার জন্য একটি এক্সটেনশন পদ্ধতি যুক্ত করেছি।

public static int MaxOrDefault<T>(this IQueryable<T> source, Expression<Func<T, int?>> selector, int nullValue = 0)
{
    return source.Max(selector) ?? nullValue;
}

এটি কেবলমাত্র হ্যান্ডলগুলি int, কিন্তু একই জন্য করা যেতে পারে long, double, বা অন্য কোন মান ধরনের প্রয়োজন। এই এক্সটেনশন পদ্ধতিটি ব্যবহার করা খুব সহজ, আপনি কেবলমাত্র আপনার নির্বাচক কার্যক্রমে পাস করেন এবং নালার জন্য বিকল্প হিসাবে ব্যবহার করার জন্য একটি মান অন্তর্ভুক্ত করেন যা ডিফল্ট 0 হয় So সুতরাং উপরেরটি এটির মতো আবারও লেখা যেতে পারে:

int maxShoeSize = Workers.Where(x => x.CompanyId == 8).MaxOrDefault(x => x.ShoeSize);

আশা করি এটি আরও বেশি লোককে সহায়তা করে।


3
দুর্দান্ত সমাধান! আরও জনপ্রিয় DefaultIfEmptyউত্তর কেবল তখনই কার্যকর Maxহয় যখন কোনও মূল্যায়ন না করা হয়।
ম্যাকগুয়ারভি 10

@ ম্যাকগুইয়ারভি 10 হ্যাঁ, আমি Selectযখন Maxফলাফলের মতো একটি সামগ্রিক ফাংশন ব্যবহার করতে যাচ্ছি তখন আমি সাধারণত মধ্যবয়সী হিসাবে ব্যবহার করতে পছন্দ করি না । আমি আরও মনে করি (আমি এটি এখনও পরীক্ষা করে দেখিনি) যে উত্পন্ন এসকিউএল এটি করে একটি অতিরিক্ত সাবলেট সাবস্ক্রাইব ব্যবহার করবে, যখন আমার শূন্য সেটটি শূন্য করে ফিরে আসবে would উক্তি এবং প্রতিক্রিয়া জন্য ধন্যবাদ! ;)
CptRobi

@ McGuireV10 একইভাবে, যদি ShoeSizeএকটি সম্পর্কিত আসলে ছিল Uniformসত্তা, আমি ব্যবহার করবে না Workers.Where(x => x.CompanyId == 8).Select(x => x.Uniform).Max(x => x.ShoeSize), পরিবর্তে আমি শুধু সমগ্র মূল্যায়ন রাখা হবে Maxফাংশন: Workers.Where(x => x.CompanyId == 8).Max(x => x.Uniform.ShoeSize)। কীভাবে দক্ষতার সাথে প্রশ্ন তৈরি করতে হবে তা সিদ্ধান্ত নেওয়ার ক্ষেত্রে ইএফকে সর্বাধিক স্বাধীনতা থাকতে দেওয়ার জন্য আমি আমার ক্যোয়ারিতে যথাসম্ভব কয়েকটি পদ্ধতি ব্যবহার করতে পছন্দ করি। ;-)
CptRobi

1
এটি এন্টি ফ্রেমওয়ার্কে কাজ করতে পারি না। কেউ কি কোন আলো ফেলতে পারে? (ডিফল্টএফএম্পটি প্রযুক্তি ব্যবহার করে)।
মো সিসকো

1
এক্সটেনশন পদ্ধতির একটি জেনেরিক সংস্করণ:public static TResult MaxOrDefault<TElement, TResult>(this IQueryable<TElement> items, Expression<Func<TElement, TResult>> selector, TResult defaultValue = default) where TResult : struct => items.Select(selector).Max(item => (TResult?)item) ?? defaultValue;
তুলনামূলকভাবে_রান্ডম

32

সর্বাধিক () সেক্ষেত্রে কিছুই ফিরিয়ে দেবে না।

উত্সটিতে কোনও উপাদান নেই বলে এটি অবৈধ অপারেশন ধারণাটি বাড়িয়ে তুলবে


InvalidOperationExceptionতালিকার অবজেক্টগুলি কোনও অ- শনাক্তযোগ্য
en


10

এটি যদি লিনক থেকে এসকিউএল হয় তবে আমি ব্যবহার করতে পছন্দ করি না Any()কারণ এর ফলে এসকিউএল সার্ভারে একাধিক ক্যোয়ারী আসে।

যদি ShoeSizeকোনও স্থূল ক্ষেত্র না হয়, তবে কেবলমাত্র ব্যবহার করে .Max(..) ?? 0কাজ করবে না তবে নিম্নলিখিতটি হবে:

int maxShoeSize = Workers.Where(x = >x.CompanyId == 8).Max(x => (int?)x.ShoeSize) ?? 0;

এটি একেবারে নির্গত এসকিউএল পরিবর্তন করে না, তবে ক্রমটি খালি থাকলে এটি 0 ফেরত দেয় কারণ এটি পরিবর্তে Max()একটি int?পরিবর্তিত করতে পরিবর্তিত হয় int


4
int maxShoeSize=Workers.Where(x=>x.CompanyId==8)
    .Max(x=>(int?)x.ShoeSize).GetValueOrDefault();

(ধরে নিলাম যে ShoeSizeটাইপ হয়int )

যদি Workersকোনও সত্তা ফ্রেমওয়ার্ক থেকে DbSetবা ObjectSetহয় তবে আপনার প্রাথমিক ক্যোয়ারীটি একটি নিক্ষেপ করবে InvalidOperationException, তবে খালি অনুক্রমের বিষয়ে অভিযোগ না করে বরং অভিযোগ করবে যে বস্তুগত মান NULL কে রূপান্তর করতে পারে না int


2

সর্বোচ্চ সিস্টেম ছুঁড়ে ফেলবে। অবৈধ অপারেশন এক্সেক্সশন "সিকোয়েন্সে কোনও উপাদান নেই"

class Program
{
    static void Main(string[] args)
    {
        List<MyClass> list = new List<MyClass>();

        list.Add(new MyClass() { Value = 2 });

        IEnumerable<MyClass> iterator = list.Where(x => x.Value == 3); // empty iterator.

        int max = iterator.Max(x => x.Value); // throws System.InvalidOperationException
    }
}

class MyClass
{
    public int Value;
}

2

এনবি: এর সাথে ক্যোয়ারী DefaultIfEmpty()উল্লেখযোগ্যভাবে ধীর হতে পারে । আমার ক্ষেত্রে এটি একটি সাধারণ প্রশ্ন ছিল .DefaultIfEmpty(DateTime.Now.Date)

আমি এটির প্রোফাইল দিতে খুব অলস ছিলাম তবে স্পষ্টতই EF সমস্ত সারি পাওয়ার এবং তারপরে Max()মানটি নেওয়ার চেষ্টা করেছিল ।

উপসংহার: কখনও কখনও হ্যান্ডলিং InvalidOperationExceptionভাল পছন্দ হতে পারে।


0

প্রিডিকেট .Max()পরিচালনা করতে এবং এর মান নির্ধারণ করতে আপনি এর মধ্যে একটি ত্রিভুজ ব্যবহার করতে পারেন ;

// assumes Workers != null && Workers.Count() > 0
int maxShoeSize = Workers.Max(x => (x.CompanyId == 8) ? x.ShoeSize : 0);

আপনার যদি Workersসংগ্রহটি শূন্য / ফাঁকা হ্যান্ডেল করা দরকার যদি এটির কোনও সম্ভাবনা থাকে তবে এটি আপনার বাস্তবায়নের উপর নির্ভর করে।


0

আপনি এটি চেষ্টা করতে পারেন:

int maxShoeSize = Workers.Where(x=>x.CompanyId == 8).Max(x => x.ShoeSize) ?? 0;

আমি মনে করি যে এটি ব্যর্থ হবে কারণ ম্যাক্স যেমন কোন পূর্বনির্মাণের প্রত্যাশা করে এবং এটি বাতিল হয়ে যায়; সুতরাং নাল-কোলেসিং অপারেটর কার্যকর হওয়ার আগেই একটি ত্রুটি ঘটেছে।
d219

0

সর্বোচ্চ () করার আগে কোনও কর্মী আছে কিনা তা আপনি পরীক্ষা করতে পারেন।

private int FindMaxShoeSize(IList<MyClass> workers) {
   var workersInCompany = workers.Where(x => x.CompanyId == 8);
   if(!workersInCompany.Any()) { return 0; }
   return workersInCompany.Max(x => x.ShoeSize);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.