আসকিউয়েরেবলের উদ্দেশ্য কী?


107

এর উদ্দেশ্য AsQueryable()ঠিক তাই আপনার চারপাশের একটি পাস করতে পারেন IEnumerableপদ্ধতি আশা পারে IQueryable, অথবা সেখানে প্রতিনিধিত্ব করতে একটি দরকারী কারণ নেই IEnumerableযেমন IQueryable? উদাহরণস্বরূপ, এটি কি এই জাতীয় কেসের জন্য থাকার কথা:

IEnumerable<Order> orders = orderRepo.GetAll();

// I don't want to create another method that works on IEnumerable,
// so I convert it here.
CountOrders(orders.AsQueryable());

public static int CountOrders(IQueryable<Order> ordersQuery)
{
    return ordersQuery.Count();
}

বা এটি আসলে এটিকে কিছু আলাদা করে তোলে:

IEnumerable<Order> orders = orderRepo.GetAll();
IQueryable<Order> ordersQuery = orders.AsQueryable();

IEnumerable<Order> filteredOrders = orders.Where(o => o.CustomerId == 3);
IQueryable<Order> filteredOrdersQuery = ordersQuery.Where(o => o.CustomerId == 3);

// Are these executed in a different way?
int result1 = filteredOrders.Count();
int result2 = filteredOrdersQuery.Count();

কি IQueryableএই এক্সটেনশন পদ্ধতি মাত্র একটি অভিব্যক্তি যে একই জিনিস করছেন শেষ পর্যন্ত একবার তার মৃত্যুদন্ড কার্যকর গড়তে সংস্করণ? আমার মূল প্রশ্নটি হ'ল ব্যবহারের ক্ষেত্রে আসল ব্যবহারের কেস AsQueryable?

উত্তর:


65

কয়েকটি প্রধান ব্যবহার রয়েছে।

  1. অন্যান্য উত্তরে উল্লিখিত হিসাবে, আপনি এটিকে মেমোরি ইন ডেটা উত্স ব্যবহার করে অনুসন্ধানযোগ্য ডেটা উত্সকে উপহাস করার জন্য ব্যবহার করতে পারেন যাতে আপনি আরও সহজেই পদ্ধতিগুলি পরীক্ষা করতে পারেন যা শেষ পর্যন্ত একটি অগণিত ভিত্তিতে ব্যবহার করা হবে IQueryable

  2. সংগ্রহগুলিতে হেরফেরের জন্য আপনি সহায়ক পদ্ধতিগুলি লিখতে পারেন যা মেমোরি সিকোয়েন্স বা বাহ্যিক ডেটা উত্সগুলিতে প্রযোজ্য। আপনি যদি IQueryableপুরোপুরি ব্যবহারের জন্য আপনার সহায়তা পদ্ধতিগুলি লিখেন তবে AsQueryableসেগুলি ব্যবহারের জন্য আপনি কেবল সমস্ত পরিগণিতকে ব্যবহার করতে পারেন। এটি আপনাকে খুব সাধারণীকৃত সহায়ক পদ্ধতির দুটি পৃথক সংস্করণ লেখা এড়াতে দেয়।

  3. এটি আপনাকে IQueryableআরও কিছু উদ্ভূত প্রকারের পরিবর্তে প্রশ্নের যোগ্য সংকলনের টাইম টাইপটিকে পরিবর্তিত করতে দেয় । কার্যকর; আপনি এটি IQueryableএকই সময়ে ব্যবহার করতে চাইলে আপনি AsEnumerableএটি ব্যবহার করতে পারেন IEnumerable। আপনার প্রয়োগ করতে পারে এমন কোনও বস্তু থাকতে পারে IQueryableতবে এটির একটি উদাহরণ Selectপদ্ধতিও রয়েছে। যদি ঘটনাটি ঘটে থাকে এবং আপনি লিনকুই Selectপদ্ধতিটি ব্যবহার করতে চেয়েছিলেন তবে আপনাকে অবজেক্টের সংকলনের সময় প্রকারটি পরিবর্তন করতে হবে IQueryable। আপনি কেবল এটি নিক্ষেপ করতে পারেন, তবে একটি AsQueryableপদ্ধতি থাকার মাধ্যমে আপনি টাইপ অনুমানের সুবিধা নিতে পারেন। জেনেরিক আর্গুমেন্ট তালিকা জটিল হলে এটি কেবল আরও সুবিধাজনক এবং জেনেরিক আর্গুমেন্টগুলির কোনও বেনামি ধরণের হয় তবে এটি আসলে প্রয়োজনীয়


উদ্দীপনা জন্য ধন্যবাদ। এটি সবচেয়ে সম্পূর্ণ হওয়ার কারণে এটি উত্তর হিসাবে চিহ্নিত করা হচ্ছে।
Ocelot20

5
প্রদত্ত যে IQueryable<T>থেকে আহরিত IEnumerable<T>ব্যাখ্যা আপনি "অ গণনীয় ভিত্তিক IQueryable" দ্বারা কি বোঝাতে চেয়েছেন দয়া করে পারেন?
দাই

2
@ ডাই এটি এমন একটিটিকে উল্লেখ করছে IQueryableযা কেবল একটি আবৃতের চেয়ে বেশি IEnumerableএবং এটি আসলে একটি এর অতিরিক্ত সামর্থ্যকে কাজে লাগায় IQueryable
পরিবেশন করুন

# 1 হ'ল আমি এটির জন্য যা চেয়েছিলাম। যাচাই করার জন্য আপনাকে ধন্যবাদ।
one.beat.consumer

12

এসকিউয়েরেবলের জন্য আমার কাছে সবচেয়ে বৈধ কেসটি ইউনিট টেস্টিং। বলুন আমার নীচের কিছুটা সংকীর্ণ উদাহরণ রয়েছে

public interface IWidgetRepository
{
   IQueryable<Widget> Retrieve();
} 

public class WidgetController
{
   public IWidgetRepository WidgetRepository {get; set;}


   public IQueryable<Widget> Get()
   {
      return WidgetRepository.Retrieve();
   }
}

এবং নিয়ামক সংগ্রহস্থল থেকে প্রাপ্ত ফলাফলগুলি আবার পাস করে তা নিশ্চিত করতে আমি একটি ইউনিট পরীক্ষা লিখতে চাই। এটি এমন কিছু দেখতে চাই:

[TestMethod]
public void VerifyRepositoryOutputIsReturned()
{    
    var widget1 = new Widget();
    var widget2 = new Widget();
    var listOfWidgets = new List<Widget>() {widget1, widget2};
    var widgetRepository = new Mock<IWidgetRepository>();
    widgetRepository.Setup(r => r.Retrieve())
      .Returns(listOfWidgets.AsQueryable());
    var controller = new WidgetController();
    controller.WidgetRepository = widgetRepository.Object;

    var results = controller.Get();

    Assert.AreEqual(2, results.Count());
    Assert.IsTrue(results.Contains(widget1));
    Assert.IsTrue(results.Contains(widget2));
}

যেখানে সত্যই, সমস্ত AsQueryable () পদ্ধতি আমাকে করতে দেয় মক সেটআপ করার সময় সংকলককে সন্তুষ্ট করে।

যদিও অ্যাপ্লিকেশন কোডটিতে এটি ব্যবহৃত হয় আমি আগ্রহী।


11

সানজুরো যেমন উল্লেখ করেছেন, AsQeryable () এর উদ্দেশ্যটি লিংক টু অবজেক্টস এবং লিনক টু এসকিউএল ব্যবহারের ক্ষেত্রে ব্যাখ্যা করা হয়েছে । বিশেষত, নিবন্ধে বলা হয়েছে,

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


6

এসকিউয়েরেবল () এর উদ্দেশ্যটি এই নিবন্ধে ব্যাপকভাবে ব্যাখ্যা করা হয়েছে টু অবজেক্টস এবং লিনাক টু এসকিউএল এর সাথে এসকিউয়েরেবল ব্যবহার করে

এমএসডিএন ক্যোয়ারিয়েবলের মন্তব্যসমূহ বিভাগ থেকে: জিজ্ঞাস্য পদ্ধতি:

যদি উত্সের ধরণটি আইকুয়্যারেবল প্রয়োগ করে তবে এসকিউয়েরেবল (আইইনুমারেবল) এটিকে সরাসরি ফেরত দেয়। অন্যথায়, এটি এমন একটি আইকিউয়েরেবল ফিরিয়ে দেয় যা ক্যোয়ারিয়েবলের পরিবর্তে এনামিউরেবলের সমতুল্য ক্যোয়ারী অপারেটর পদ্ধতিগুলিকে কল করে কোয়েরিগুলি কার্যকর করে।

Thats ঠিক উপরোক্ত নিবন্ধে উল্লিখিত এবং ব্যবহৃত হয়। আপনার উদাহরণে এটি অর্ডারপ্রেস.গেটআল রিটার্নিং, আইইনুমারবেবল বা আইকুয়েরেবল (লিনক থেকে এসকিউএল) কী তার উপর নির্ভর করে। যদি এটি আইকিউয়েরেবল ফিরিয়ে দেয় তবে গণনা () পদ্ধতি ডাটাবেসে কার্যকর করা হবে অন্যথায় এটি মেমরিতে কার্যকর করা হবে। উল্লেখযোগ্য নিবন্ধে উদাহরণের সাথে সাবধানতার সাথে দেখুন।


3

ইন্টারফেস IQueryableউদ্ধৃতি ডকুমেন্টেশন:

আইকিউয়েরেবল ইন্টারফেসটি ক্যোয়ারী সরবরাহকারী দ্বারা বাস্তবায়নের উদ্দেশ্যে তৈরি।

সুতরাং যে কারও জন্য NET- এ এটির ডেটাস্ট্রাকচারকে জিজ্ঞাস্য করে তুলতে চান, সেই ডেটাস্ট্রাকচারটি গণনা করা যেতে পারে বা বৈধ গণক থাকতে পারে

IEnumeratorপরিবর্তে ডেটা এর পুনরাবৃত্তি এবং প্রক্রিয়াজাতকরণ জন্য একটি ইন্টারফেস ।


আপনি কি এটিকে পুনরায় প্রকাশ করতে মন চান: "যে ডেটাস্ট্রাকচারটি প্রয়োজনীয় নয় তা গণনা করা যেতে পারে বা বৈধ গণক থাকতে পারে"। আমি মধ্যে পার্থক্য বুঝতে IQueryableএবং IEnumerable, কিন্তু আমি ব্যবহারের ক্ষেত্রে বুঝতে পারছি না AsQueryableএক্সটেনশন পদ্ধতি। যদিও আমি সেই বাক্যটিতে কিছুটা বিভ্রান্ত হচ্ছি, যা আমার সন্দেহ হয় যে আমি যে উত্তরটি খুঁজছি তা থাকতে পারে (উত্স অনুসারে))
ওসেলোট 20

@ ওসেলোট 20: এর অর্থ হ'ল ডেটাস্ট্রাকচার যা সরবরাহকারী দ্বারা উপস্থাপিত হয়েছে যা আইকুয়েরেবল প্রয়োগ করে এটি একটি অঙ্কের ক্ষমতা উপলব্ধ করতে পারে না। এটি সরবরাহকারীর উপর নির্ভর করে। দস্তাবেজের উদ্ধৃতি: "এক্সিকিউট পদ্ধতিটি বলা হয়ে থাকে এমন পরীক্ষাগুলি যে ফলশ্রুতিতে ফলপ্রসূ হয় না তা কার্যকর করা হয়" "
টিগ্রান

সম্ভবত আমি স্পষ্ট কিছু মিস করছি, তবে "আমার কেন ব্যবহারের প্রয়োজন হবে AsQueryable()?" এর উত্তর আমি এখনও দেখতে পাচ্ছি না ? যদি আমি একটি IEnumerable (ইতিমধ্যে একটি গণনার সক্ষমতা সরবরাহ করতে সক্ষম কিছু) দিয়ে শুরু করছি , তবে কেন আমাকে IQueryableএক্সটেনশন পদ্ধতিটি ব্যবহার করে রূপান্তর করতে হবে AsQueryable()? এটি একটি কার্যকর কোড যেখানে উদাহরণস্বরূপ একটি ছোট কোড উদাহরণ? আমি আপনার ব্যাখ্যায় কিছু অনুপস্থিত মনে হচ্ছে। আপনার সময় জন্য ধন্যবাদ।
ওসেলোট 20

@ ওসেলোট20: কোয়েরি সরবরাহকারীর লেখার জন্য আমার যে পার্থক্য রয়েছে তা সত্যই প্রকাশ করতে। তুমি জানো যে আমরা linq to sql, linq to xml.. এবং তাই আপনি যদি লিখতে চান linqচালক যে লক্ষ্যমাত্রা আপনার ডেটা strucutres ( linq to your data), তাই আপনার API ব্যবহারকারীদের চালানোর জন্য একটি সম্ভাবনা থাকবে linqবিরুদ্ধে ক্যোয়ারী আপনার ডাটা স্ট্রাকচার, আপনি নির্বাচন করতে হবেIQueryable
Tigran

2
আপনি IQueryableএবং এর মধ্যে পার্থক্য ব্যাখ্যা করছেন বলে মনে হচ্ছে IEnumerable। আমি পার্থক্য জানি, এবং আমি যা চাইছি তা নয়। আমি জিজ্ঞাসা করছি কেন কেউ কেন এমন কিছু গ্রহণ করতে চায় যা প্রয়োগ করে IEnumerable, এবং এটি এক্সটেনশন পদ্ধতি IQueryableব্যবহার করে রূপান্তর করতে পারে AsQueryable। আপনি কি উত্তর দিচ্ছেন? আমি এখনও বলতে পারি না ..
Ocelot20
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.