লিনকিউ অর্ডারবি বনাম থ্যাটার বাই


123

এর মধ্যে পার্থক্য কি কেউ ব্যাখ্যা করতে পারেন:

tmp = invoices.InvoiceCollection
              .OrderBy(sort1 => sort1.InvoiceOwner.LastName)
              .OrderBy(sort2 => sort2.InvoiceOwner.FirstName)
              .OrderBy(sort3 => sort3.InvoiceID);

এবং

tmp = invoices.InvoiceCollection
              .OrderBy(sort1 => sort1.InvoiceOwner.LastName)
              .ThenBy(sort2 => sort2.InvoiceOwner.FirstName)
              .ThenBy(sort3 => sort3.InvoiceID);

আমি যদি 3 আইটেমের আইটেম দিয়ে অর্ডার করতে চাই তবে সঠিক পদ্ধতিরটি কোনটি?

উত্তর:


212

আপনার অবশ্যইThenBy একাধিক OrderByকলের পরিবর্তে ব্যবহার করা উচিত ।

আমি এটি প্রস্তাব করব:

tmp = invoices.InvoiceCollection
              .OrderBy(o => o.InvoiceOwner.LastName)
              .ThenBy(o => o.InvoiceOwner.FirstName)
              .ThenBy(o => o.InvoiceID);

আপনি কীভাবে প্রতিবার একই নাম ব্যবহার করতে পারেন তা নোট করুন। এটিও সমান:

tmp = from o in invoices.InvoiceCollection
      orderby o.InvoiceOwner.LastName,
              o.InvoiceOwner.FirstName,
              o.InvoiceID
      select o;

আপনি যদি OrderByএকাধিকবার কল করেন তবে এটি কার্যকরভাবে ক্রমটি পুরোপুরি তিনবার পুনঃক্রম করতে হবে ... সুতরাং চূড়ান্ত কল কার্যকরভাবে প্রভাবশালী হবে। আপনি যা করতে পারেন (LINQ মধ্যে বস্তু) লেখ

foo.OrderBy(x).OrderBy(y).OrderBy(z)

যা সমান হবে

foo.OrderBy(z).ThenBy(y).ThenBy(x)

ক্রম ক্রম স্থিতিশীল হিসাবে, কিন্তু আপনার একেবারে উচিত নয়:

  • এটা পড়া কঠিন
  • এটি ভাল সম্পাদন করে না (কারণ এটি পুরো ক্রমটি পুনরায় সাজিয়ে তোলে)
  • এটি অন্য সরবরাহকারীগুলিতে ভাল না কাজ করতে পারে (উদাঃ লিংক থেকে এসকিউএল)
  • এটি মূলত কীভাবে ব্যবহারের OrderByজন্য ডিজাইন করা হয়েছিল তা নয় ।

বিন্দুটি OrderByহল "সর্বাধিক গুরুত্বপূর্ণ" অর্ডার প্রজেকশন সরবরাহ করা; তারপরে ThenBy(বারবার) মাধ্যমিক, তৃতীয় ইত্যাদি নির্দিষ্টকরণের জন্য অনুমানগুলি অর্ডার করুন।

কার্যকরভাবে, এটি এইভাবে চিন্তা করুন: OrderBy(...).ThenBy(...).ThenBy(...)আপনাকে যে কোনও দুটি বস্তুর জন্য একটি একক যৌগিক তুলনা তৈরি করতে দেয় এবং তারপরে সেই সংমিশ্রিত তুলনাটি একবার ব্যবহার করে ক্রমটি বাছাই করে । এটি প্রায় অবশ্যই আপনি চান।


2
আমি যা ভেবেছিলাম তা স্থিত করে তবে কোনও কারণে অর্ডারবাই, থ্যাটারবাই, থ্যাটারবাই সঠিকভাবে বাছাই করছে বলে মনে হয় না তাই আমি ভাবছিলাম যে আমি এটি সঠিকভাবে ব্যবহার করছি কিনা।
DazManCat

14
নোট করুন যে ক্যোয়ারী সিনট্যাক্সে অর্ডার দেওয়ার জন্য মূল শব্দটি আসলে অর্ডারবাই দ্বারা আদেশ করা হয় না। ( পেডেন্ট্রিটির জন্য দুঃখিত - কেবলমাত্র আমি বলতে চেয়েছিলাম যে আমি একবার জন
স্কিইটের

1
জন, কিছু আমার জন্য একসাথে খাপ খায় না তবে আপনার একেবারে অধ্যায়টি হওয়া উচিত নয় (এটি লিনক ফ্লুয়েন্ট সিনট্যাক্স ব্যবহার করে একাধিক অর্ডার বাই প্রয়োগ করার সাথে সম্পর্কিত কারণ এটি থ্যাটারবাইতে স্থানীয় অনুসন্ধানগুলিতে অনুবাদ করে): এটি ভাল সম্পাদন করে না (কারণ এটি পুরো ক্রমটি পুনঃক্রম করে) - আপনি কি দ্বিতীয় বা তৃতীয় ক্রমটিকে পুরো ক্রমটি পুনঃক্রম করে বোঝান? যদি তা হয় তবে পূর্ববর্তী ক্রমটি বাতিল করে ক্রমানুসারে পুনরায় অর্ডার দেওয়ার পরে কীভাবে এটি থাববি-তে অনুবাদ হবে?
ভিভারকে

@ ভিভারকে: এটি পুরো ক্রমটি পুনঃক্রম করে, তবে একটি স্থিতিশীল উপায়ে, সুতরাং যদি দুটি মানের একই z মান হয়, ক্রমটি y এবং তারপরে x এর উপর নির্ভর করে।
জন স্কিটি

1
@ ভিভারকে: OrderBy(a).OrderBy(b).OrderBy(c)এখনও পূর্ববর্তী ক্রমটির আউটপুট ব্যবহার করে এবং পুরো জিনিসটিকে পুনর্বিন্যাস করে তবে এটি বিদ্যমান ক্রমটি সংরক্ষণ করে (পূর্ববর্তী পদক্ষেপ থেকে) যেখানে দুটি উপাদান নতুন তুলনার আওতায় সমান। আমাদের ঠিক আছে কল্পনা OrderBy(a).OrderBy(b)। ফলাফলগুলি OrderBy(a)ক্রমবর্ধমান aক্রমে হয় এবং তারপরে সেগুলি পুনরায় সাজানো হয় b। চূড়ান্ত ফলাফলের ক্ষেত্রে, যদি দুটি মানের একই bমান হয় তবে সেগুলি aস্থিতিশীল হওয়ার কারণে আদেশ করা হবে - সুতরাং এটি সমান OrderBy(b).ThenBy(a)
জন স্কিটি

2

জেনেরিক উপায়ে ক্যোরি তৈরির চেষ্টা করে আমি এই পার্থক্যটি বিরক্তিকর বলে মনে করেছি, তাই যথাসময়ে অর্ডারবাই / থেইনবাই তৈরি করতে আমি আপনার পক্ষে যতটা পছন্দ করেছি তার জন্য একটু সহায়ক করেছি।

public class EFSortHelper
{
  public static EFSortHelper<TModel> Create<TModel>(IQueryable<T> query)
  {
    return new EFSortHelper<TModel>(query);
  }
}  

public class EFSortHelper<TModel> : EFSortHelper
{
  protected IQueryable<TModel> unsorted;
  protected IOrderedQueryable<TModel> sorted;

  public EFSortHelper(IQueryable<TModel> unsorted)
  {
    this.unsorted = unsorted;
  }

  public void SortBy<TCol>(Expression<Func<TModel, TCol>> sort, bool isDesc = false)
  {
    if (sorted == null)
    {
      sorted = isDesc ? unsorted.OrderByDescending(sort) : unsorted.OrderBy(sort);
      unsorted = null;
    }
    else
    {
      sorted = isDesc ? sorted.ThenByDescending(sort) : sorted.ThenBy(sort)
    }
  }

  public IOrderedQueryable<TModel> Sorted
  {
    get
    {
      return sorted;
    }
  }
}

আপনার ব্যবহারের ক্ষেত্রে এটি নির্ভর করে আপনি এটি ব্যবহার করতে পারেন এমন অনেকগুলি উপায় রয়েছে তবে আপনি যদি উদাহরণস্বরূপ স্ট্রিং এবং বুল হিসাবে সাজানো কলাম এবং দিকনির্দেশের একটি তালিকা পাস করেন তবে আপনি সেগুলি লুপ করতে পারেন এবং এগুলি একটি স্যুইচে ব্যবহার করতে পারেন:

var query = db.People.AsNoTracking();
var sortHelper = EFSortHelper.Create(query);
foreach(var sort in sorts)
{
  switch(sort.ColumnName)
  {
    case "Id":
      sortHelper.SortBy(p => p.Id, sort.IsDesc);
      break;
    case "Name":
      sortHelper.SortBy(p => p.Name, sort.IsDesc);
      break;
      // etc
  }
}

var sortedQuery = sortHelper.Sorted;

ফলাফলটি sortedQueryএখানে অন্য উত্তর হিসাবে সতর্কতার সাথে বারবার রিসোর্ট না করে কাঙ্ক্ষিত ক্রমে সাজানো হয়।


1
অথবা শুধু কিছু এক্সটেনশন পদ্ধতি stackoverflow.com/a/45486019/1300910
huysentruitw


0

হ্যাঁ, আপনি যদি একাধিক কী নিয়ে খেলেন তবে একাধিক অর্ডারবি ব্যবহার করা উচিত নয়। এরপরে বাই নিরাপদ বাজি কারণ এটি অর্ডারবাইয়ের পরে সঞ্চালন করবে।

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