লিনিকিউতে একাধিক "অর্ডার করুন"


1582

আমি দুই টেবিল আছে, moviesএবং categories, এবং আমি দ্বারা একটি আদেশ তালিকা পেতে শ্রেণী ID প্রথম এবং তারপর নাম

মুভি টেবিলটিতে তিনটি কলাম আইডি, নাম এবং বিভাগের আইডি রয়েছে । বিভাগ সারণিতে দুটি কলাম আইডি এবং নাম রয়েছে

আমি নীচের মতো কিছু চেষ্টা করেছিলাম, তবে এটি কার্যকর হয়নি।

var movies = _db.Movies.OrderBy( m => { m.CategoryID, m.Name })

এখানে কেন এটি কাজ করতে পারে না: প্রথম বন্ধনীগুলিতে ল্যাম্বডা এক্সপ্রেশনটি এমন কোনও মান প্রত্যাবর্তনের কথা যা আইটেমগুলি অর্ডার করার জন্য ব্যবহার করা যেতে পারে: এম। ক্যাটাগরিআইডি একটি নম্বর যা আইটেমগুলি অর্ডার করতে ব্যবহার করা যেতে পারে। তবে "এম। ক্যাটাগরিআইডি, এম.নেম" এই প্রসঙ্গে কোনও অর্থ দেয় না।
চিককোদোর

8
.তখন আপনি কি অনুসন্ধান করছেন?
eka808

যদি কোনও সুযোগে আপনি তাদের এখানে সাজানো ক্রম অনুসারে বাছাই করতে চান তবে এখানে যাওয়ার উপায়।
আরবিটি

উত্তর:


2831

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

var movies = _db.Movies.OrderBy(c => c.Category).ThenBy(n => n.Name)

4
অবশ্যই উত্তরের জন্য ধন্যবাদ ... তবে এর পরিবর্তে Var movies = _db.Movies.Orderby(c => c.Category).ThenBy(n => n.Name) আমি যদি Var movies = _db.Movies.Orderby(c => c.Category).OrderBy(n => n.Name) 2 বার "অর্ডার বাই" ব্যবহার করি তবে ফলাফলটি কেন আলাদা?

147
@ দেবেন্দ্র, ফলাফলটি আলাদা কারণ দ্বিতীয় "অর্ডারবাই" সংগ্রহটির উপরে কাজ করে যা প্রথম "অর্ডার বাই" এর ফলাফল এবং এর আইটেমগুলি পুনঃক্রম করে

68
পৃথিবীতে আমি কীভাবে এইসব না জেনে এতক্ষণ চলে গেলাম ThenBy!? ( সম্পাদনা করুন: দেখে মনে হচ্ছে এটি নেট নেট in.০ এ প্রবর্তিত হয়েছিল, এটি ব্যাখ্যা করে যে এটি কীভাবে আমার নজরে পড়ে যায় না pped)
জর্ডান গ্রে

13
লিনকিউ যুক্ত হওয়ার পরে এটি সেখানে রয়েছে। এই উত্তর প্রাক। নেট 4.0।
নাথান ডব্লু

10
হ্যাঁ, আমি সিদ্ধান্ত নিয়েছি যে খুব তাড়াতাড়ি 3.5 এর ভিত্তিতে ডকুমেন্টেশন পৃষ্ঠায় সংস্করণ ড্রপডাউন না হওয়া ; সংস্করণ সম্পর্কিত তথ্যের জন্য আমার সমস্ত দিকে নজর দেওয়া উচিত ছিল। সংশোধনীর জন্য ধন্যবাদ. :)
জর্দান গ্রে

594

ল্যাম্বডা, ক্যোয়ারী-সিনট্যাক্স লিনকিউ ব্যবহার করে আপনি এটি করতে পারেন:

var movies = from row in _db.Movies 
             orderby row.Category, row.Name
             select row;

[মন্তব্যটি সম্বোধন করার জন্য সম্পাদনা করুন] বাছাইয়ের ক্রমটি নিয়ন্ত্রণ করতে, কীওয়ার্ডগুলি ascending(যা ডিফল্ট এবং তাই বিশেষভাবে কার্যকর নয়) ব্যবহার করুন বা descendingযেমন:

var movies = from row in _db.Movies 
             orderby row.Category descending, row.Name
             select row;

1
এই সিনট্যাক্সে অবতরণ এবং অ-এর মধ্যে পিছনে পিছনে পিছনে যাওয়ার কোনও উপায় নেই?
এএইচডিভি

1
আসলে, আপনার উত্তর সমতুল্য _db.Movies.Orderby(c => c.Category).OrderBy(n => n.Name)। আরো সঠিকfrom row in _db.Movies orderby row.Category descending orderby row.Name select row
Lodewijk

9
@ লোডউইজক: আমি বিশ্বাস করি আপনার ঠিক পিছনের দিকে এটি আছে। আপনার উদাহরণটি সারি শেষ হবে N নামটি প্রাথমিক কলাম এবং সারি ateg ক্যাটাগরি মাধ্যমিক, যা এর সমতুল্য _db.Movies.Orderby(c => c.Category).OrderBy(n => n.Name)। আপনার দেওয়া দুটি স্নিপেটগুলি একে অপরের সমতুল্য, অপের সমতুল্য নয়।
স্কট

6
লিনকের জন্য এসকিউএল সিনট্যাক্স ব্যবহারের একমাত্র অবক্ষয়টি হ'ল সমস্ত ফাংশন সমর্থিত নয়, বেশিরভাগ কিন্তু সমস্ত নয়
জোশুয়া জি

74

"নতুন" যুক্ত করুন:

var movies = _db.Movies.OrderBy( m => new { m.CategoryID, m.Name })

এটি আমার বাক্সে কাজ করে। এটি এমন কিছু ফেরত দেয় যা সাজানোর জন্য ব্যবহার করা যেতে পারে। এটি দুটি মান সহ একটি বস্তু প্রদান করে।

অনুরূপ, তবে নিম্নলিখিত হিসাবে একটি সম্মিলিত কলাম দ্বারা বাছাই করা পৃথক।

var movies = _db.Movies.OrderBy( m => (m.CategoryID.ToString() + m.Name))

21
সংখ্যার জন্য এটি ব্যবহার করার সময় সতর্কতা অবলম্বন করুন।
ওউএফ_এঞ্জেল

7
আপনি আপনার প্রয়োজনের উপর নির্ভর করে অর্ডারবাইডেসেন্ডিং এবং থেইনবাই, বা অর্ডারবাই এবং থটারবাইডেসেন্ডিং ব্যবহার করতে পারেন।
আলী শাহ আহমেদ

6
আমি নিশ্চিত যে এটি .OrderBy( m => new { m.CategoryID, m.Name })এবং .OrderBy( m => new { m.Name, m.CategoryID })পূর্বনির্ধারিত অগ্রাধিকারকে সম্মান না করে একই ফলাফল তৈরি করবে। এটি মাঝে মাঝে আপনাকে অর্ডার দিয়ে খাঁটি কাকতালীয়ভাবে খাঁটিভাবে দিতে চাইবে। m.CategoryID.ToString() + m.Nameশ্রেণিবদ্ধ হিসাবে যদি কোনও অতিরিক্ত অর্ডারগুলি উত্পাদন করে int। উদাহরণস্বরূপ, আইডি = 123, নাম = 5 টাইমযুক্ত কিছু আইডি = 1234, নাম = এর পরিবর্তে আগের পরিবর্তে উপস্থিত হবে। স্ট্রিং তুলনা করতেও অক্ষম নয় যেখানে ইনটার তুলনাগুলি ঘটতে পারে।
অ্যারোনএলএস

7
আমি যখন বেনামে টাইপ করে অর্ডার দেওয়ার চেষ্টা করি তখন "কমপক্ষে একটি অবজেক্ট অবশ্যই আইকোম্যাবলে বাস্তবায়ন করতে পারে" বার্তাটি সহ একটি আর্গুমেন্টএক্সেপশন পাই। আমি অন্যদের এটি করার সময় তুলনামূলক ঘোষণা করতে দেখছি। স্ট্যাকওভারফ্লো . com/ প্রশ্নগুলি 10353564/ … দেখুন ।
রবার্ট গওল্যান্ড

4
এটি একেবারে ভুল। কোনও নতুন বেনামি প্রকারের সাথে অর্ডার করা যার কোনও আইসিম্পেরেবল বাস্তবায়ন কাজ করতে পারে না, কারণ কোনও বেনামি ধরণের বৈশিষ্ট্যের অর্ডার নেই। প্রথমে ক্যাটাগরিআইড বা নাম নাম অনুসারে বাছাই করা হবে কিনা তা জানা ছিল না, বিপরীত ক্রমে বাছাই করা হয় তবে তা ছেড়ে দিন।
ট্রায়ঙ্কো

29

কনসোলে ডেটা কনটেক্সটে এসকিউএল ক্রিয়াকলাপটি লগ করতে আপনার ডেটা কনটেক্সটে নিম্নলিখিত লাইনটি ব্যবহার করুন - তারপরে আপনি দেখতে পাচ্ছেন যে আপনার লিনাক স্টেটমেন্টগুলি ডাটাবেস থেকে অনুরোধ করছে:

_db.Log = Console.Out

নিম্নলিখিত লিনকিউ বিবৃতি:

var movies = from row in _db.Movies 
             orderby row.CategoryID, row.Name
             select row;

এবং

var movies = _db.Movies.OrderBy(m => m.CategoryID).ThenBy(m => m.Name);

নিম্নলিখিত এসকিউএল উত্পাদন:

SELECT [t0].ID, [t0].[Name], [t0].CategoryID
FROM [dbo].[Movies] as [t0]
ORDER BY [t0].CategoryID, [t0].[Name]

অন্যদিকে, লিন্কে একটি অর্ডারবাই পুনরাবৃত্তি করা ফলাফল SQL আউটপুটটিকে বিপরীত বলে মনে হচ্ছে:

var movies = from row in _db.Movies 
             orderby row.CategoryID
             orderby row.Name
             select row;

এবং

var movies = _db.Movies.OrderBy(m => m.CategoryID).OrderBy(m => m.Name);

নিম্নলিখিত এসকিউএল উত্পাদন করুন (নাম এবং বিভাগ আইডি স্যুইচ করা হয়েছে):

SELECT [t0].ID, [t0].[Name], [t0].CategoryID
FROM [dbo].[Movies] as [t0]
ORDER BY [t0].[Name], [t0].CategoryID

24

আমি কিছু এক্সটেনশান পদ্ধতি তৈরি করেছি (নীচে) যাতে আপনার কোনও আইকুয়েরেবল ইতিমধ্যে অর্ডার করা হয় বা না হয় তা চিন্তা করার দরকার নেই। আপনি যদি একাধিক বৈশিষ্ট্য অনুসারে অর্ডার করতে চান তবে কেবল নীচে এটি করুন:

// We do not have to care if the queryable is already sorted or not. 
// The order of the Smart* calls defines the order priority
queryable.SmartOrderBy(i => i.Property1).SmartOrderByDescending(i => i.Property2);

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

public static class IQueryableExtension
{
    public static bool IsOrdered<T>(this IQueryable<T> queryable) {
        if(queryable == null) {
            throw new ArgumentNullException("queryable");
        }

        return queryable.Expression.Type == typeof(IOrderedQueryable<T>);
    }

    public static IQueryable<T> SmartOrderBy<T, TKey>(this IQueryable<T> queryable, Expression<Func<T, TKey>> keySelector) {
        if(queryable.IsOrdered()) {
            var orderedQuery = queryable as IOrderedQueryable<T>;
            return orderedQuery.ThenBy(keySelector);
        } else {
            return queryable.OrderBy(keySelector);
        }
    }

    public static IQueryable<T> SmartOrderByDescending<T, TKey>(this IQueryable<T> queryable, Expression<Func<T, TKey>> keySelector) {
        if(queryable.IsOrdered()) {
            var orderedQuery = queryable as IOrderedQueryable<T>;
            return orderedQuery.ThenByDescending(keySelector);
        } else {
            return queryable.OrderByDescending(keySelector);
        }
    }
}

1
এই উত্তরটি সোনার! আমি এই পোস্ট থেকে উত্তর সঙ্গে queryable.IsOrdered () জন্য চেক একত্রিত করব একটি একক পদ্ধতি যা কেমন দিক লাগে আছে: stackoverflow.com/questions/388708
SwissCoder

1
এইভাবে লিনক বাস্তবায়ন প্রথম স্থানে যাওয়া উচিত! অর্ডারবাই খারাপভাবে ডিজাইন করা হয়েছে ...
আন্দ্রেজ মার্টিনা

1
@ মেরি আপনি স্পষ্টভাবে ব্যবহারের বিষয়টি বুঝতে পারেন নি। উদাহরণস্বরূপ বৈশিষ্ট্যের তালিকা থেকে আপনি কীভাবে গতিময় অর্ডার তৈরি করবেন? এই একমাত্র উপায়. অনুগ্রহ করে বিবেচনা করুন এবং পুনর্বিবেচনা করবেন না। ধন্যবাদ.
sjkm

যথেষ্ট ফর্সা। আমি এখনও সুবিধাটি দেখতে পাচ্ছি না তবে আমি আমার ভোটটি ফিরিয়ে নেব
মেরি

nullable datetime
এগ্রি

16

লিনকিউ ব্যবহার করে এটি করার জন্য কমপক্ষে আরও একটি উপায় আছে, যদিও এটি সবচেয়ে সহজ নয়। আপনি OrberBy()যে পদ্ধতিটি ব্যবহার করেন এটি ব্যবহার করে এটি করতে পারেন IComparer। প্রথমে আপনার IComparerএই Movieশ্রেণীর জন্য একটি বাস্তবায়ন করতে হবে :

public class MovieComparer : IComparer<Movie>
{
    public int Compare(Movie x, Movie y)
    {
        if (x.CategoryId == y.CategoryId)
        {
            return x.Name.CompareTo(y.Name);
        }
        else
        {
            return x.CategoryId.CompareTo(y.CategoryId);
        }
    }
}

তারপরে আপনি নিম্নলিখিত সিনট্যাক্স সহ সিনেমাগুলি অর্ডার করতে পারেন:

var movies = _db.Movies.OrderBy(item => item, new MovieComparer());

আপনার যদি কোনও আইটেমের জন্য ক্রমকে উতরে যাওয়ার জন্য স্যুইচ করতে হয় তবে কেবল x এবং y এর মধ্যে স্যুইচ করুন Compare() তবে MovieComparerসেই অনুযায়ী পদ্ধতিটির ।


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

1
২০১২ সাল থেকে (.NET সংস্করণ 4.5) আপনার MovieComparerনিজের একটি বর্গ তৈরি করতে হবে না ; পরিবর্তে আপনি করতে পারেন _db.Movies.OrderBy(item => item, Comparer<Movie>.Create((x, y) => { if (x.CategoryId == y.CategoryId) { return x.Name.CompareTo(y.Name); } else { return x.CategoryId.CompareTo(y.CategoryId); } }));। অবশ্যই, যদি আপনি if... এর পরিবর্তে লজিককে একটি অভিব্যক্তি হিসাবে লিখতে পছন্দ করেন elseতবে লামদা আরও (x, y) => exprসহজ হতে পারে।
জেপ্পে স্টিগ নীলসেন

3

জেনেরিক সংগ্রহস্থল ব্যবহার করুন

> lstModule = _ModuleRepository.GetAll().OrderBy(x => new { x.Level,
> x.Rank}).ToList();

আর

> _db.Module.Where(x=> ......).OrderBy(x => new { x.Level, x.Rank}).ToList();

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