নাল কলামের মাধ্যমে লাইনকিউ অর্ডার যেখানে ক্রমটি আরোহণ হয় এবং নালগুলি শেষ হওয়া উচিত


141

আমি তাদের দাম অনুসারে পণ্যগুলির তালিকা বাছাই করার চেষ্টা করছি।

ফলাফল সেটটির কলামের মাধ্যমে কম থেকে উচ্চ পর্যন্ত দাম অনুসারে পণ্যগুলি তালিকাভুক্ত করা দরকার LowestPrice। যাইহোক, এই কলামটি নোলযোগ্য।

আমি তালিকাটিকে এইভাবে সাজানো ক্রম অনুসারে বাছাই করতে পারি:

var products = from p in _context.Products
   where p.ProductTypeId == 1
   orderby p.LowestPrice.HasValue descending
   orderby p.LowestPrice descending
   select p;

// returns:    102, 101, 100, null, null

তবে আমি কীভাবে এটি আরোহণের ক্রমে বাছাই করতে পারি তা বুঝতে পারি না।

// i'd like: 100, 101, 102, null, null

11
orderby p.LowestPrice ?? Int.MaxValue;একটি সহজ উপায়।
পোস্টম্যান

3
@ পোষ্টম্যান: হ্যাঁ, এটি সহজ, এটি সঠিক ফলাফল অর্জন করে তবে OrderByDescending, ThenByএটি আরও পরিষ্কার।
জেসন

@ জেসন, হ্যাঁ আমি এর সিনট্যাক্সটি জানতাম না orderby, এবং এটির সন্ধান করতে
পারছিলাম

উত্তর:


160

উভয় কলাম একই অর্ডবাইতে রাখার চেষ্টা করুন।

orderby p.LowestPrice.HasValue descending, p.LowestPrice

অন্যথায় প্রতিটি অর্ডারবাই হ'ল সংগ্রহের জন্য পৃথক ক্রিয়াকলাপ এটি প্রতিটি সময় পুনরায় অর্ডার করে।

এটির সাথে প্রথমে একটি মান সহ একটিটিকে অর্ডার করা উচিত, "তারপরে" মানটির ক্রম।


21
সাধারণ ভুল, লোমদা সিনট্যাক্সের সাথে লোকেরা একই কাজ করে - ব্যবহার করে rd
ডেভশো

1
নীচে শীর্ষ এবং নাল ক্ষেত্রের মান সহ ক্ষেত্রগুলি অর্ডার করার জন্য এটি কাজ করেছে : orderby p.LowestPrice == null, p.LowestPrice ascending আশা কারও পক্ষে সহায়তা করে।
শাইজুট

@ ডেভশো টিপটির জন্য আপনাকে ধন্যবাদ - বিশেষত মন্তব্যটি - খুব পরিপাটি - ভাল লাগবে
দেমেট্রিস লেপ্টোস

86

এটি লিনকিউ ক্যোয়ারী সিনট্যাক্স এবং এটি কীভাবে লিনকিউ পদ্ধতি কলগুলিতে অনুবাদ করা হয়েছে তা বুঝতে সহায়তা করে।

এটা দেখা যাচ্ছে যে

var products = from p in _context.Products
               where p.ProductTypeId == 1
               orderby p.LowestPrice.HasValue descending
               orderby p.LowestPrice descending
               select p;

সংকলক দ্বারা অনুবাদ করা হবে

var products = _context.Products
                       .Where(p => p.ProductTypeId == 1)
                       .OrderByDescending(p => p.LowestPrice.HasValue)
                       .OrderByDescending(p => p.LowestPrice)
                       .Select(p => p);

এটি জোরালোভাবে আপনি যা চান তা নয়। দ্বারা এই প্রকারের Product.LowestPrice.HasValueমধ্যে descendingঅর্ডার ও তারপর পুনরায় বাছাই করে দ্বারা সম্পূর্ণ সংগ্রহ Product.LowestPriceমধ্যে descendingঅর্ডার।

আপনি যা চান তা হ'ল

var products = _context.Products
                       .Where(p => p.ProductTypeId == 1)
                       .OrderByDescending(p => p.LowestPrice.HasValue)
                       .ThenBy(p => p.LowestPrice)
                       .Select(p => p);

যা আপনি কোয়েরি সিনট্যাক্স ব্যবহার করে পেতে পারেন

var products = from p in _context.Products
               where p.ProductTypeId == 1
               orderby p.LowestPrice.HasValue descending,
                       p.LowestPrice
               select p;

কোয়েরি সিনট্যাক্স থেকে পদ্ধতি কলগুলিতে অনুবাদগুলির বিশদর জন্য ভাষার স্পেসিফিকেশন দেখুন। সিরিয়াসলি। এটি পড়ুন।


4
+1 বা শুধু ... LINQ সিনট্যাক্স :) শুভ ব্যাখ্যা তবু লিখুন না
sehe

18

স্ট্রিং মানগুলির সমাধানটি সত্যই অদ্ভুত:

.OrderBy(f => f.SomeString == null).ThenBy(f => f.SomeString) 

কাজ করার একমাত্র কারণ হ'ল প্রথম অভিব্যক্তি OrderBy(), বাছাইয়ের boolমান: true/ falsefalseফলাফলটি প্রথমে ফলাফল অনুসরণ করুন true(নালাগুলি) এবং ThenBy()নন-নাল মানগুলিকে বর্ণমালা অনুসারে বাছাই করুন।

সুতরাং, আমি এর চেয়ে আরও বেশি পাঠযোগ্য কিছু করা পছন্দ করি:

.OrderBy(f => f.SomeString ?? "z")

যদি SomeStringনাল হয় তবে এটি প্রতিস্থাপন করা হবে "z"এবং তারপরে সমস্ত বর্ণমালা অনুসারে বাছাই করুন।

দ্রষ্টব্য: "z"জেড-মানগুলির মতো প্রথমে যাওয়ার পরে এটি চূড়ান্ত সমাধান নয় zebra

আপডেট 9/6/2016 - @ জর্নহড মন্তব্য সম্পর্কে, এটি সত্যিই একটি ভাল সমাধান, তবে এটি এখনও কিছুটা জটিল, সুতরাং আমি এটিকে কোনও এক্সটেনশন ক্লাসে মোড়ানোর পরামর্শ দেব:

public static class MyExtensions
{
    public static IOrderedEnumerable<T> NullableOrderBy<T>(this IEnumerable<T> list, Func<T, string> keySelector)
    {
        return list.OrderBy(v => keySelector(v) != null ? 0 : 1).ThenBy(keySelector);
    }
}

এবং সহজ এটি ব্যবহার করুন:

var sortedList = list.NullableOrderBy(f => f.SomeString);

2
আমি মনে করি এটি খারাপ পাঠের চেয়ে আরও পঠনযোগ্য: .অর্ডারবাই (f => f.SomeString! = নাল? 0: 1) .তখন বাই (এফ => f.SomeString)
জর্নেহড

14

এই পরিস্থিতিতে আমার আর একটি বিকল্প আছে। আমার তালিকা অবজেক্টের তালিকা এবং আমার অর্ডার করতে হবে তবে নালগুলি অবশ্যই শেষের দিকে। আমার সিদ্ধান্ত:

var newList = objList.Where(m=>m.Column != null)
                     .OrderBy(m => m.Column)
                     .Concat(objList.where(m=>m.Column == null));

এটি এমন পরিস্থিতিতে এমন পরিস্থিতিতে কাজ করতে পারে যেখানে শূন্যের জায়গায় 0 টির মতো অন্যান্য মানের সাথে ফলাফল চায়।
নরেশ রাভালানী

হ্যাঁ. কেবল নাল 0 এ প্রতিস্থাপন করুন
গুরজেন হোভেস্পিয়ান

এই একমাত্র উত্তর যা আমার পক্ষে কাজ করেছিল, বাকিরা তালিকার শুরুতে শূন্য রাখে।
BMMS

9

আমি এটির একটি লিনকিউ সমাধান সন্ধান করার চেষ্টা করছিলাম তবে উত্তরগুলি থেকে এটি কার্যকর করতে পারিনি।

আমার চূড়ান্ত উত্তর ছিল:

.OrderByDescending(p => p.LowestPrice.HasValue).ThenBy(p => p.LowestPrice)

7

আমার সিদ্ধান্ত:

Array = _context.Products.OrderByDescending(p => p.Val ?? float.MinValue)

7

এটিই আমি নিয়ে এসেছি কারণ আমি এক্সটেনশন পদ্ধতিগুলি ব্যবহার করছি এবং আমার আইটেমটিও একটি স্ট্রিং, এভাবে নেই .HasValue:

.OrderBy(f => f.SomeString == null).ThenBy(f => f.SomeString)

এটি মেনুতে লিনকুই 2 অবজেক্টের সাথে কাজ করে। আমি এটি EF বা কোনও ডিবি ওআরএম দিয়ে পরীক্ষা করিনি।


0

নীচে নাল পরীক্ষা করার জন্য এক্সটেনশন পদ্ধতিটি আপনি কী কীলেকের বাচ্চার সম্পত্তি বাছাই করতে চান তা নীচে দেওয়া আছে।

public static IOrderedEnumerable<T> NullableOrderBy<T>(this IEnumerable<T> list, Func<T, object> parentKeySelector, Func<T, object> childKeySelector)
{
    return list.OrderBy(v => parentKeySelector(v) != null ? 0 : 1).ThenBy(childKeySelector);
}

এবং সহজ এটি ব্যবহার করুন:

var sortedList = list.NullableOrderBy(x => x.someObject, y => y.someObject?.someProperty);

0

এখানে অন্য উপায়:

//Acsending
case "SUP_APPROVED_IND": qry =
                            qry.OrderBy(r => r.SUP_APPROVED_IND.Trim() == null).
                                    ThenBy(r => r.SUP_APPROVED_IND);

                            break;
//….
//Descending
case "SUP_APPROVED_IND": qry =
                            qry.OrderBy(r => r.SUP_APPROVED_IND.Trim() == null).
                                    ThenByDescending(r => r.SUP_APPROVED_IND); 

                            break;

SUP_APPROVED_IND is char(1) in Oracle db.

নোট যে r.SUP_APPROVED_IND.Trim() == nullহিসাবে বিবেচিত হয়trim(SUP_APPROVED_IND) is null ওরাকল ডিবি ।

বিশদের জন্য এটি দেখুন: সত্তা কাঠামোর নাল মানগুলির জন্য আমি কীভাবে জিজ্ঞাসা করতে পারি?


0

আরেকটি বিকল্প (আমাদের দৃশ্যের জন্য কার্যকর ছিল):

আমাদের একটি ব্যবহারকারীর টেবিল রয়েছে, সংরক্ষণ করা হচ্ছে ADName, LastName, FirstName

  • ব্যবহারকারীদের বর্ণমালা করা উচিত
  • তাদের প্রথম নাম / শেষ নাম যেমন নেই তেমনি তাদের এডনামের উপর ভিত্তি করে - তবে ব্যবহারকারী-তালিকার শেষে
  • আইডি "0" ("কোনও নির্বাচন নয়") এর সাথে ডামি ব্যবহারকারী সর্বদা শীর্ষে থাকা উচিত।

আমরা টেবিলের স্কিমাটি পরিবর্তন করেছি এবং একটি "SortIndex" কলাম যুক্ত করেছি, যা কিছু বাছাই গোষ্ঠী সংজ্ঞায়িত করে। (আমরা 5 এর ব্যবধান রেখেছি, সুতরাং আমরা পরে দলগুলি canোকাতে পারি)

ID | ADName |      First Name | LastName | SortIndex
0    No Selection  null         null     | 0
1    AD\jon        Jon          Doe      | 5
3    AD\Support    null         null     | 10     
4    AD\Accounting null         null     | 10
5    AD\ama        Amanda       Whatever | 5

এখন, কোয়েরি অনুসারে এটি হবে:

SELECT * FROM User order by SortIndex, LastName, FirstName, AdName;

পদ্ধতি এক্সপ্রেশন:

db.User.OrderBy(u => u.SortIndex).ThenBy(u => u.LastName).ThenBy(u => u.FirstName).ThenBy(u => u.AdName).ToList();

যা প্রত্যাশিত ফলাফল দেয়:

ID | ADName |      First Name | LastName | SortIndex
0    No Selection  null         null     | 0
5    AD\ama        Amanda       Whatever | 5
1    AD\jon        Jon          Doe      | 5
4    AD\Accounting null         null     | 10
3    AD\Support    null         null     | 10     
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.