সাবলীল এবং ক্যোয়ারী এক্সপ্রেশন - একে অপরের থেকে কোনও উপকার (গুলি) আছে কি?


255

লিনিকিউ জেনারিকস থেকে নেট। নেটতে সবচেয়ে বড় উন্নতিগুলির একটি এবং এটি আমার প্রচুর সময় এবং কোডের লাইন সঞ্চয় করে। যাইহোক, সাবলীল বাক্যবিন্যাস কোয়েরি এক্সপ্রেশন সিনট্যাক্সের চেয়ে আমার কাছে অনেক বেশি প্রাকৃতিক বলে মনে হচ্ছে।

var title = entries.Where(e => e.Approved)
    .OrderBy(e => e.Rating).Select(e => e.Title)
    .FirstOrDefault();

var query = (from e in entries
             where e.Approved
             orderby e.Rating
             select e.Title).FirstOrDefault();

দুজনের মধ্যে কি কোনও পার্থক্য রয়েছে বা একে অপরের থেকে কোনও বিশেষ সুবিধা রয়েছে?


1
জটিল প্রশ্নের জন্য, আমি ল্যাম্বডা সিনট্যাক্সটিকে আরও বোধগম্য / পঠনযোগ্য, তবে ক্যোয়ারী বাক্য গঠনটি কেবল সহজ প্রিটিয়ারের মতো পাই।
নওফাল

উত্তর:


255

না হয় ভাল: তারা বিভিন্ন প্রয়োজন পরিবেশন। আপনি একাধিক পরিসরের ভেরিয়েবলগুলি লাভ করতে চাইলে ক্যারিয়ার সিনট্যাক্সটি তার নিজের মধ্যে আসে । এটি তিনটি পরিস্থিতিতে ঘটে:

  • লেট কীওয়ার্ডটি ব্যবহার করার সময়
  • যখন আপনার একাধিক জেনারেটর রয়েছে ( ক্লজগুলি থেকে )
  • যখন যোগ দেয়

এখানে লাইনকপ্যাডের নমুনাগুলির একটি উদাহরণ রয়েছে:

string[] fullNames = { "Anne Williams", "John Fred Smith", "Sue Green" };

var query =
  from fullName in fullNames
  from name in fullName.Split()
  orderby fullName, name
  select name + " came from " + fullName;

এখন পদ্ধতি সিনট্যাক্সে এটি একই জিনিসটির সাথে তুলনা করুন:

var query = fullNames
  .SelectMany (fName => fName.Split().Select (name => new { name, fName } ))
  .OrderBy (x => x.fName)
  .ThenBy  (x => x.name)
  .Select  (x => x.name + " came from " + x.fName);

অন্যদিকে, মেথড সিনট্যাক্স, ক্যোয়ারী অপারেটরগুলির সম্পূর্ণ স্বর উন্মোচন করে এবং সাধারণ প্রশ্নের সাথে আরও সংক্ষিপ্ত। কোয়েরি এবং পদ্ধতি সিনট্যাক্সের মিশ্রণের মাধ্যমে আপনি উভয় বিশ্বের সেরাটি পেতে পারেন। এটি প্রায়শই লিনকিউ থেকে এসকিউএল কোয়েরিতে করা হয়:

var query =
  from c in db.Customers
  let totalSpend = c.Purchases.Sum (p => p.Price)    // Method syntax here
  where totalSpend > 1000
  from p in c.Purchases
  select new { p.Description, totalSpend, c.Address.State };

2
চমৎকার উত্তর. আপনি কি সম্পর্কে আমাকে কিছুটা বলতে পারেন ".ছুনি (নাম => নতুন {নাম, fName})" কী করছে?
কুইলব্রেকার

12
এটি একটি বেনামে সম্পূর্ণ নামের সাথে পৃথক শব্দ (অ্যানি, উইলিয়ামস, জন ইত্যাদি) নির্বাচন করে। এটি আপনাকে আসল পুরো নামটি "বহন" করতে দেয় যাতে আপনার বাকী ক্যোয়ারীতে পুরো নাম এবং পৃথক শব্দ উভয়ই অ্যাক্সেস থাকে।
জো আলবাহারী

58

আমি যখন পুরো অভিব্যক্তিটি সেভাবে লিখতে পারি তবে আমি উত্তরোত্তর (কখনও কখনও "ক্যোরি বোঝার সিনট্যাক্স" নামে পরিচিত) ব্যবহার করতে পছন্দ করি।

var titlesQuery = from e in entries
                  where e.Approved
                  orderby e.Rating
                  select e.Titles;

var title = titlesQuery.FirstOrDefault();

যত তাড়াতাড়ি আমাকে যুক্ত করতে হবে (বন্ধনী) এবং .MethodCalls(), আমি পরিবর্তন করি।

আমি যখন আগেরটি ব্যবহার করি তখন আমি সাধারণত প্রতি লাইনে একটি ধারা থাকি:

var title = entries
    .Where (e => e.Approved)
    .OrderBy (e => e.Rating)
    .Select (e => e.Title)
    .FirstOrDefault();

আমি পড়তে যে একটু সহজ।


29

প্রতিটি শৈলীতে তাদের পক্ষে মতামত রয়েছে। ক্যোয়ারী সিনট্যাক্স সুন্দর যখন এটি যোগদান করে আসে এবং এটি দরকারী আছে যাক শব্দ সহজ একটি ক্যোয়ারী ভিতরে অস্থায়ী ভেরিয়েবল তৈরি করে তোলে।

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

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


"যেহেতু এগুলি কেবল এক্সটেনশন পদ্ধতি তাই আপনি নিজের লেখাতে পারেন।" - আপনি এই সমস্যা চালানো হবে? stackoverflow.com/a/3850254/1175496
লাল মটর

20

ইন VB.NET আমি খুব সিনট্যাক্স পছন্দ করে।

আমি কুৎসিত- Functionশব্দটির পুনরাবৃত্তি করতে ঘৃণা করি:

Dim fullNames = { "Anne Williams", "John Fred Smith", "Sue Green" };
Dim query =
     fullNames.SelectMany(Function(fName) fName.Split().
     Select(Function(Name) New With {Name, fName})).
     OrderBy(Function(x) x.fName).
     ThenBy(Function(x) x.Name).
     Select(Function(x) x.Name & " came from " & x.fName)

এই ঝরঝরে ক্যোয়ারী আমার মতে অনেক বেশি পঠনযোগ্য এবং বজায় রাখা যায়:

query = From fullName In fullNames
        From name In fullName.Split()
        Order By fullName, name
        Select name & " came from " & fullName

VB.NET এর সিনট্যাক্স এছাড়াও আরো শক্তিশালী এবং কম C # এর চেয়ে বাগাড়ম্বরপূর্ণ হল: https://stackoverflow.com/a/6515130/284240

উদাহরণস্বরূপ এই লিনকিউ থেকে ডেটাসেট (অবজেক্টস) কোয়েরি

VB.NET:

Dim first10Rows = From r In dataTable1 Take 10

সি #:

var first10Rows = (from r in dataTable1.AsEnumerable() 
                   select r)
                   .Take(10);

9
যারা ভিবি বিকাশকারীগণ ক্যোয়ারী স্টাইল ব্যবহার করতে পারবেন না তাদের প্রতি আমার সহানুভূতি।
নওফাল

1
আপনার সর্বশেষ সি # উদাহরণটি মূল্যবান হিসাবে খুব সরলতর: আপনি কেবল `ডেটা টেবিল 1 লিখবেন sআস.গণিত () Take নিন (10);
এমির

@ এমির: আমার শেষ অনুচ্ছেদটি যা "ভিবি.এনইটি-র কোয়েরি সিনট্যাক্স দিয়ে শুরু হয়" সি # এর তুলনায় আরও শক্তিশালী এবং কম ভার্বোস কেবলমাত্র # # এর সাথে ভিবি.এনইটি-র কোয়েরি সিনট্যাক্সের তুলনা করছে, আপনি পদ্ধতি সিনট্যাক্স ব্যবহার করছেন।
টিম শ্মেলেটার

15

আমি কোয়েরি সিনট্যাক্সটি মোটেও পাই না। আমার মনে এর কোন কারণ নেই। আসুন .অনুচিত এবং বেনামে টাইপ দিয়ে প্রাপ্ত করা যেতে পারে। আমি কেবল মনে করি জিনিসগুলিকে সেখানে "বিরামচিহ্ন" দিয়ে অনেক বেশি সুসংহত দেখাচ্ছে।


9
একাধিক যোগদানকারী সাবলীল সিনট্যাক্সের সাথে বেশ দ্রুত শ্রমসাধ্য হতে পারে। আমি সাধারণত সাবলীল নিজেকে ব্যবহার করি না - যদি না জড়িত থাকে।
রোমান স্টারকভ

1
@ ইনস্ট্যান্স হান্টার: এখানেও। সাবলীল বাক্যবিন্যাসের ধারণাটি উপলব্ধি করতে আমার বেশ সময় লাগল took শক্তিশালী গণনাযোগ্য এবং "খাঁটি" ফাংশনগুলির ধারণার সাথে একত্রে, আমি এখন সত্যিই এটি উপভোগ করছি এবং পূর্বে কৌশলপূর্ণ পরিস্থিতিগুলির কোনও সুন্দর কোড উপস্থাপনা ছিল না। মস্তিষ্কের ইয়ে-ওলে-এসকিউএল-অংশের জন্য, ক্যোয়ারী সিনট্যাক্স থাকা এখনও একটি আশীর্বাদ।
সান-কুন ক্লার্ক-ডেভিস

13

সাবলীল ইন্টারফেস যদি একটি যেখানে আছে। আমার যদি কোনও সিলেক্ট বা অর্ডারবাইয়ের প্রয়োজন হয় তবে আমি সাধারণত ক্যোয়ারির বাক্য গঠনটি ব্যবহার করি।


8

প্রবাহিত বাক্য গঠনটি প্রকৃতপক্ষে আরও শক্তিশালী বলে মনে হয় না, এটি ছোট পুনরায় ব্যবহারযোগ্য পদ্ধতিতে কোড সংগঠিত করার জন্য আরও ভাল কাজ করা উচিত।


5

আমি জানি এই প্রশ্নটি সি # দিয়ে ট্যাগ করা আছে, তবে সাবলীল সিন্ট্যাক্সটি ভিবি.এনইটি-র সাথে বেদনাদায়কভাবে ভার্বোজ হয়।


4

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


4

যদিও আমি বুঝতে এবং সাবলীল ফর্ম্যাটটি পছন্দ করি না কেন, আমি পঠনযোগ্যতার কারণে আপাতত ক্যোয়ারিতে আটকেছি। লিনকিউ-তে কেবল পরিচিত লোকেরা ক্যোয়ারিকে পড়তে আরও বেশি স্বাচ্ছন্দ্য করবে।


4

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


4

আমি লিনকটি প্রায় 6 মাস ধরে ব্যবহার করছি। আমি যখন এটি প্রথম ব্যবহার করা শুরু করেছি তখন আমি ক্যোয়ারী বাক্য গঠনটি পছন্দ করেছি কারণ এটি টি-এসকিউএল এর সাথে খুব মিল similar

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


3

আমি সবেমাত্র আমাদের সংস্থার স্ট্যান্ডার্ড সেট আপ করেছি এবং আমরা এক্সটেনশন পদ্ধতিগুলি প্রয়োগ করতে পারি। আমি মনে করি একে অপরের থেকে একটি বেছে নেওয়া এবং কোডগুলিতে সেগুলি মিশ্রিত না করা ভাল ধারণা। এক্সটেনশন পদ্ধতিগুলি অন্যান্য কোডের মতো আরও পড়ুন।

বোধগম্য বাক্য গঠনটি সমস্ত অপারেটর এবং ক্যোয়ারির চারপাশে প্রথম বন্ধনী ব্যবহার করে না এবং শুরু থেকে এক্সটেনশন পদ্ধতিগুলি ব্যবহার করার জন্য আমাকে অনুরোধ করার পরে এক্সটেনশন পদ্ধতি যুক্ত করে।

তবে বেশিরভাগ অংশে এটি ব্যাতিক্রমের সাথে কেবল ব্যক্তিগত পছন্দ।


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