আপনি কেন ফানক <টি> এর চেয়ে এক্সপ্রেশন <ফানক <টি>> ব্যবহার করবেন?


948

আমি ল্যাম্বডাস Funcএবং Actionপ্রতিনিধিদের বুঝতে পারি । কিন্তু এক্সপ্রেশন আমাকে স্টম্প।

কোন পরিস্থিতিতে আপনি Expression<Func<T>>একটি সরল পুরানো চেয়ে একটি ব্যবহার করবেন Func<T>?


14
ফানক <> সি # সংকলক স্তরে কোনও পদ্ধতিতে রূপান্তরিত হবে, এক্সপ্রেশন <ফানক <>> এমএসআইএল স্তরে সরাসরি কোডটি সংকলনের পরে কার্যকর করা হবে, এ কারণেই এটি দ্রুততর হয়
ওয়ালিদ একে

1
উত্তরগুলি ছাড়াও, csharp ভাষার স্পেসিফিকেশন "4.6 এক্সপ্রেশন ট্রি
ট্রিপস

উত্তর:


1133

আপনি যখন ল্যাম্বডা এক্সপ্রেশনটিকে এক্সপ্রেশন ট্রি হিসাবে চিকিত্সা করতে চান এবং সেগুলি কার্যকর করার পরিবর্তে তাদের ভিতরে সন্ধান করেন। উদাহরণস্বরূপ, লিনকিউ থেকে এসকিউএল অভিব্যক্তিটি পেয়ে যায় এবং এটিকে সমতুল্য এসকিউএল স্টেটমেন্টে রূপান্তরিত করে এবং সার্ভারে জমা দেয় (ল্যাম্বডা কার্যকর করার পরিবর্তে)।

ধারণার দিক থেকে, Expression<Func<T>>হয় সম্পূর্ণ ভিন্ন থেকে Func<T>Func<T>এমনটি বোঝায় delegateযা কোনও পদ্ধতির কাছে অনেকটা পয়েন্টার এবং ল্যাম্বডা এক্সপ্রেশনের জন্য একটি ট্রি ডেটার কাঠামোকেExpression<Func<T>> বোঝায় । এই গাছের কাঠামোটি বর্ণনা করে যে ল্যাম্বডা এক্সপ্রেশনটি আসল জিনিসটি না করে কী করে। এটি মূলত এক্সপ্রেশন, ভেরিয়েবল, মেথড কল, ... র সমন্বয় সম্পর্কে ডেটা ধারণ করে ... (উদাহরণস্বরূপ এটি এই ল্যাম্বডা কিছু ধ্রুবক + কিছু পরামিতি হিসাবে তথ্য ধারণ করে)। আপনি এই বিবরণটিকে একটি আসল পদ্ধতিতে (এর সাথে ) রূপান্তর করতে ব্যবহার করতে পারেন বা এর সাথে অন্যান্য স্টাফগুলি (যেমন লাইনকিউকে এসকিউএল উদাহরণে) করতে পারেন। বেনামে পদ্ধতি এবং অভিব্যক্তি গাছ হিসাবে ল্যাম্বডাসের আচরণ করার বিষয়টি নিখুঁতভাবে একটি সঙ্কলন কালীন জিনিস।Expression.Compile

Func<int> myFunc = () => 10; // similar to: int myAnonMethod() { return 10; }

কার্যকরভাবে কোনও আইএল পদ্ধতিতে সংকলন করবে যা কিছুই না পেয়ে 10 প্রদান করে।

Expression<Func<int>> myExpression = () => 10;

কোনও ডেটা স্ট্রাকচারে রূপান্তরিত হবে যা এমন একটি অভিব্যক্তি বর্ণনা করে যা কোনও পরামিতি পায় না এবং মান 10 ফেরায়:

এক্সপ্রেশন বনাম ফানক বৃহত্তর চিত্র

সংকলনের সময় উভয়ই একই দেখায়, সংকলকটি যা উত্পন্ন করে তা সম্পূর্ণ আলাদা


95
সুতরাং, অন্য কথায়, Expressionএকটিতে একটি নির্দিষ্ট প্রতিনিধি সম্পর্কে মেটা-তথ্য থাকে।
বার্টল

39
@ বার্টল আসলে, না প্রতিনিধি মোটেই জড়িত না। কোনও প্রতিনিধিটির সাথে কোনও সম্পর্ক থাকার কারণ হ'ল আপনি কোনও প্রতিনিধিটির কাছে অভিব্যক্তিটি সংকলন করতে পারেন - বা আরও সুনির্দিষ্টভাবে বলতে গেলে কোনও পদ্ধতিতে এটি সংকলন করতে পারেন এবং সেই পদ্ধতিতে প্রতিনিধিটিকে ফেরত মূল্য হিসাবে পেতে পারেন। তবে এক্সপ্রেশন ট্রি নিজেই কেবল ডেটা। আপনি যখন ন্যায়বিচারের Expression<Func<...>>পরিবর্তে ব্যবহার করেন তখন প্রতিনিধিটির অস্তিত্ব থাকে না Func<...>
লুয়ান

5
@ কাইল ডেলানির এ (isAnExample) => { if(isAnExample) ok(); else expandAnswer(); }জাতীয় অভিব্যক্তি একটি এক্সপ্রেশনট্রি, ইফ -স্টেটমেন্টের জন্য শাখা তৈরি করা হয়েছে।
মাত্তিও মার্সিয়ানো - এমএসসিপি

3
@ বার্টেল ডেলিগেট হ'ল সিপিইউ যা দেখায় (এক আর্কিটেকচারের এক্সিকিউটেবল কোড), এক্সপ্রেশন হ'ল সংকলক (সোর্স কোডের কেবলমাত্র অন্য ফর্ম্যাট, তবে সোর্স কোড)।
কোডওয়ারিওর

5
@ বার্টল: এটি আরও সঠিকভাবে বলে সংক্ষিপ্ত করে বলা যেতে পারে যে স্ট্রিংবিল্ডার একটি স্ট্রিংয়ের কাছে কী বোঝায় তা একটি ফানকে। এটি কোনও স্ট্রিং / ফানক নয়, এটি করতে বললে এটি তৈরি করার জন্য প্রয়োজনীয় ডেটা থাকে।
তোলা

336

আমি উত্তরের জন্য নুবস যুক্ত করছি কারণ এই উত্তরগুলি আমার মাথার উপরে অনুভূত হয়েছিল, যতক্ষণ না বুঝেছি এটি কতটা সহজ। কখনও কখনও এটি আপনার প্রত্যাশা যে এটি জটিল যে আপনাকে 'আপনার মাথাটি এটি মুড়ে রাখতে "অক্ষম করে তোলে।

আমি সত্যিই বিরক্তিকর 'বাগ'-এ লিনকু-টু-এসকিউএলকে সাধারণভাবে ব্যবহার করার চেষ্টা না করা পর্যন্ত তফাতটি বোঝার দরকার নেই:

public IEnumerable<T> Get(Func<T, bool> conditionLambda){
  using(var db = new DbContext()){
    return db.Set<T>.Where(conditionLambda);
  }
}

বড় ডেটাসেটগুলিতে আমি আউট অফ মেমরিএক্সেপশন পেতে শুরু না করা পর্যন্ত এটি দুর্দান্ত কাজ করেছে। ল্যাম্বদার ভিতরে ব্রেকপয়েন্টগুলি সেট করে দেওয়া আমার বুঝতে পেরেছিল যে এটি আমার টেবিলের প্রতিটি সারিতে একের পর এক আমার ল্যাম্বডা অবস্থার সাথে ম্যাচ খুঁজছে ite এটি আমাকে কিছুক্ষণের জন্য স্ট্যাম্পড করেছিল, কেন হ্যাক কেন এটি ডেটা টেবিলটিকে লিনকু-টু-এসকিউএল করার পরিবর্তে লিঙ্ক-টু-এসকিউএল করার পরিবর্তে দৈত্য আইয়নামারেবল হিসাবে বিবেচনা করছে? এটি আমার লিনিকিউ-থেকে-মঙ্গোডিবি সমমনা অংশে ঠিক একই জিনিসটি করছিল।

ফিক্সটি কেবল Func<T, bool>রূপান্তরিত করার জন্য ছিল Expression<Func<T, bool>>, সুতরাং আমি এখানে শেষ পর্যন্ত কেন এটির Expressionপরিবর্তে এর প্রয়োজন হবে তা আমি গুগল করেছিলাম Func

একটি অভিব্যক্তি কেবল নিজের প্রতিনিধিদের নিজের সম্পর্কে একটি ডেটাতে পরিণত করে। সুতরাং a => a + 1এমন কিছু হয়ে যায় "বাম দিকে একটি রয়েছে int athe ডানদিকে আপনি এতে 1 যুক্ত করেন।" এটাই. আপনি এখন বাড়িতে যেতে পারেন। এটি অবশ্যই তার থেকে আরও কাঠামোগত, তবে এটি মূলত সমস্ত অভিব্যক্তি গাছই হ'ল - আপনার মাথাটি প্রায় জড়িয়ে রাখার কিছুই নেই।

এটি বুঝতে পেরে, লাইনকিউ-এসকিউএল কেন দরকার Expressionএবং Funcএটি পর্যাপ্ত নয় তা স্পষ্ট হয়ে যায় । Funcএটি কীভাবে কোনও এসকিউএল / মঙ্গোডিবি / অন্যান্য ক্যোয়ারিতে অনুবাদ করা যায় তার মূর্খতা দেখতে, নিজের মধ্যে toোকার উপায় নিয়ে আসে না। আপনি এটি দেখতে পাচ্ছেন না এটি সংযোজন বা গুণফল বা বিয়োগফল করছে কিনা। আপনি যা করতে পারেন তা এটি চালানো। Expressionঅন্যদিকে, আপনাকে প্রতিনিধিটির অভ্যন্তরে দেখতে এবং এটি করতে চায় এমন সমস্ত কিছু দেখতে দেয়। এটি আপনাকে এসকিউএল কোয়েরির মতো প্রতিনিধিটিকে যা খুশি তাই অনুবাদ করার ক্ষমতা দেয়। Funcকাজ করেনি কারণ আমার DbContext ল্যাম্বডা এক্সপ্রেশনটির বিষয়বস্তুতে অন্ধ ছিল। এর কারণে, এটি ল্যাম্বডা এক্সপ্রেশনটিকে এসকিউএলে রূপান্তর করতে পারে না; তবে এটি পরবর্তী সেরা কাজটি করেছিল এবং আমার টেবিলে প্রতিটি সারি জুড়ে শর্তসাপেক্ষ পুনরুক্তি করেছে।

সম্পাদনা: জন পিটারের অনুরোধে আমার শেষ বাক্যটি ব্যাখ্যা করে:

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


2
চাদ; দয়া করে এই মন্তব্যটি আরও কিছুটা ব্যাখ্যা করুন: "ফানক কাজ করেনি কারণ আমার ডিবি কনটেক্সট এসএমএল-তে পরিণত করার জন্য ল্যাম্বডা এক্সপ্রেশনটিতে আসলে যা ছিল তা অন্ধ ছিল, তাই এটি পরবর্তী সেরা কাজটি করেছিল এবং আমার টেবিলের প্রতিটি সারির মধ্য দিয়ে শর্তসাপেক্ষে পুনরাবৃত্তি করেছিল Fun । "
জন পিটারস

2
>> ফানক ... আপনি যা করতে পারেন তা এটি চালানো। এটি ঠিক সত্য নয়, তবে আমি মনে করি যে এটিই সেই বিষয়টিকে জোর দেওয়া উচিত। ফানকস / অ্যাকশনগুলি চালিত করতে হবে, এক্সপ্রেশনগুলি বিশ্লেষণ করতে হবে (দৌড়ানোর আগে বা চালানোর পরিবর্তে)।
কনস্ট্যান্টিন

@ চ্যাড কি এখানে সমস্যাটি ছিল ?: ডিবি.সেট <টি> সমস্ত ডাটাবেস টেবিলটি অনুসন্ধান করেছিল এবং তারপরে, কারণ .শর্তে (কন্ডিশন ল্যাম্বদা) হ'ল (আইমনুমারেবল) এক্সটেনশন পদ্ধতিটি ব্যবহার করেছে, যা মেমরির পুরো টেবিলে অঙ্কিত আছে? । আমি মনে করি আপনি আউটঅফমিউরিএক্সেপশন পেয়েছেন কারণ, এই কোডটি পুরো টেবিলটি মেমোরিতে লোড করার চেষ্টা করেছিল (এবং অবশ্যই অবজেক্ট তৈরি করেছিল)। আমি কি সঠিক? ধন্যবাদ :)
বেনস ভ্যাজার্ট

104

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

এক্সপ্রেশন বনাম সত্তা ফ্রেমওয়ার্ক Func আরো এবং LINQ প্রেমে পতনশীল - পার্ট 7: এক্সপ্রেশন এবং Funcs (শেষ অধ্যায়)


ব্যাখ্যার জন্য + এল। তবে আমি পেয়েছি 'দ্য লিনকিউ এক্সপ্রেশন নোড টাইপ' ইনভোক 'লিনকিউতে সত্তাগুলিতে সমর্থিত নয়' ' এবং ফলাফল আনার পরে ফোরইচ ব্যবহার করতে হয়েছিল।
tymtam

77

আমি এর ভিন্নতা নিয়ে কিছু নোট যোগ করতে চান Func<T>এবং Expression<Func<T>>:

  • Func<T> এটি একটি সাধারণ পুরাতন স্কুল মাল্টিকাস্টডেলিগেট;
  • Expression<Func<T>> এক্সপ্রেশন ট্রি আকারে ল্যাম্বডা এক্সপ্রেশন একটি প্রতিনিধিত্ব;
  • ল্যাম্বডা এক্সপ্রেশন সিনট্যাক্সের মাধ্যমে বা API সিনট্যাক্সের মাধ্যমে এক্সপ্রেশন ট্রি তৈরি করা যেতে পারে;
  • এক্সপ্রেশন ট্রি একটি প্রতিনিধি সংকলন করা যেতে পারে Func<T>;
  • বিপরীত রূপান্তর তাত্ত্বিকভাবে সম্ভব, তবে এটি এক ধরণের পচনশীল, এটির জন্য কোনও বিল্টিন কার্যকারিতা নেই কারণ এটি কোনও সরল প্রক্রিয়া নয়;
  • এক্সপ্রেশন ট্রি পর্যবেক্ষণ / অনুবাদ / সংশোধন করা যেতে পারে এর মাধ্যমে ExpressionVisitor;
  • IEnumerable জন্য এক্সটেনশন পদ্ধতিগুলি কাজ করে Func<T>;
  • আইকিউয়েরেবলের জন্য এক্সটেনশন পদ্ধতিগুলি কাজ করে Expression<Func<T>>

কোডের নমুনাগুলির সাথে বিশদ বর্ণনা করে এমন একটি নিবন্ধ রয়েছে:
লিনক: ফানক <টি> বনাম এক্সপ্রেশন <ফানক <টি>>

আশা করি এটি সহায়ক হবে।


দুর্দান্ত তালিকা, একটি ছোট নোট আপনি উল্লেখ করেছেন যে বিপরীত রূপান্তর সম্ভব, তবে সঠিক বিপরীতটি নেই। রূপান্তর প্রক্রিয়া চলাকালীন কিছু মেটাডেটা হারিয়ে গেছে। তবে আপনি এটিকে একটি এক্সপ্রেশন ট্রিতে ছড়িয়ে দিতে পারেন যা আবার সংকলন করার সময় একই ফলাফল তৈরি করে।
এইডিয়াকাপি

76

ক্রিজিস্তফ ক্লওয়িনার বই ( ফ্রেমওয়ার্ক ডিজাইনের গাইডলাইন: কনভেনশন, আইডিয়ামস এবং পুনরায় ব্যবহারযোগ্য। নেট গ্রন্থাগারসমূহের প্যাটার্নস ) থেকে এ সম্পর্কে আরও দার্শনিক ব্যাখ্যা রয়েছে ;

রিকো মারিয়ানি

নন-চিত্র সংস্করণের জন্য সম্পাদনা করুন:

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


10
ভাল করা. অর্থাত। আপনি যখন আপনার ফানককে কোনও ধরণের কোয়েরিতে রূপান্তরিত করার প্রত্যাশা করছেন তখন আপনার প্রকাশের প্রয়োজন। অর্থাৎ। আপনি database.data.Where(i => i.Id > 0)হিসাবে মৃত্যুদন্ড কার্যকর করা প্রয়োজন SELECT FROM [data] WHERE [id] > 0। আপনি শুধুমাত্র একটি Func মধ্যে পাস, তাহলে আপনি আপনার চালক উপর অন্ধ রেখেছি এবং সমস্ত এটা করতে পারেন হয় SELECT *প্রতিটি এবং ফিল্টার মাধ্যমে এবং তারপর একবার এটি মেমরিতে যে সমস্ত ডেটা লোড করছে, বারবার আইডি> 0. আপনার মোড়ানো সঙ্গে সবকিছু Funcমধ্যে Expressionক্ষমতা ড্রাইভারটি বিশ্লেষণ করতে Funcএবং এটিকে একটি এসকিউএল / মঙ্গোডিবি / অন্যান্য অনুসন্ধানে রূপান্তর করতে।
চাদ হেডককক

সুতরাং যখন আমি অবকাশের জন্য পরিকল্পনা করছি তখন আমি ব্যবহার করব Expressionতবে যখন আমি ছুটিতে যাব তখনই এটি হবে Func/Action;)
গোল্ডবিশপ

1
@ চাদহেডগকক এটি আমার চূড়ান্ত টুকরো ছিল। ধন্যবাদ। আমি এটি কিছুক্ষণের জন্য দেখছি এবং আপনার মন্তব্য এখানে সমস্ত অধ্যয়নকে ক্লিক করেছে।
জননি

37

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

string result = client.Invoke(svc => svc.SomeMethod(arg1, arg2, ...));

এটি সমাধান করতে এক্সপ্রেশন ট্রিটিকে SomeMethod(এবং প্রতিটি আর্গুমেন্টের মান) ডিকনস্ট্রাক্ট করে, আরপিসি কল সঞ্চালন করে, কোনও ref/ outআরগ আপডেট করে এবং রিমোট কল থেকে ফলাফলটি দেয়। এটি কেবল এক্সপ্রেশন ট্রি দ্বারা সম্ভব। আমি এখানে আরও কভার ।

অন্য উদাহরণটি হ'ল যখন আপনি জেনেরিক অপারেটর কোড দ্বারা সম্পন্ন ল্যাম্বডায় সংকলনের উদ্দেশ্যে ম্যানুয়ালি এক্সপ্রেশন ট্রি তৈরি করছেন ।


20

আপনি যখন নিজের ফাংশনটিকে কোড হিসাবে নয়, ডেটা হিসাবে বিবেচনা করতে চান তখন আপনি একটি অভিব্যক্তি ব্যবহার করবেন। আপনি কোডটি (ডেটা হিসাবে) ম্যানিপুলেট করতে চাইলে আপনি এটি করতে পারেন। বেশিরভাগ সময় যদি আপনি ভাবের প্রয়োজন না দেখেন তবে সম্ভবত আপনাকে এটি ব্যবহারের প্রয়োজন হবে না।


19

প্রাথমিক কারণ হ'ল আপনি যখন কোডটি সরাসরি চালাতে চান না, বরং এটি পরীক্ষা করতে চান। এটি যে কোনও কারণেই হতে পারে:

  • কোডটি অন্য পরিবেশে ম্যাপিং করা (যেমন সিটি কোড সত্তা ফ্রেমওয়ার্কে এসকিউএল তে)
  • রানটাইমের কোডের অংশগুলি প্রতিস্থাপন (গতিশীল প্রোগ্রামিং বা এমনকি সাধারণ ডিআরওয়াই কৌশল)
  • কোড বৈধতা (স্ক্রিপ্টিং অনুকরণ করার সময় বা বিশ্লেষণ করার সময় খুব দরকারী)
  • সিরিয়ালাইজেশন - এক্সপ্রেশনগুলি বরং সহজেই এবং নিরাপদে ক্রমিকায়িত করা যায়, প্রতিনিধিরা পারেন না
  • অন্তর্নিহিত দৃ strongly়ভাবে টাইপ না করা জিনিসগুলির উপর দৃ -়-টাইপযুক্ত সুরক্ষা এবং আপনি রানটাইমে গতিশীল কল করার পরেও সংকলক চেকগুলি শোষণ করে নিন (রেজার সহ এএসপি.নেট এমভিসি 5 একটি দুর্দান্ত উদাহরণ)

আপনি 5 নং 5
uowzd01

@ uowzd01 খালি রেজার দিকে নজর দিন - এটি এই পদ্ধতিটি ব্যাপকভাবে ব্যবহার করে।
লুয়ান

@ লুয়ান আমি এক্সপ্রেশন সিরিয়ালাইজেশন খুঁজছি কিন্তু সীমিত তৃতীয় পক্ষের ব্যবহার ছাড়া কিছুই খুঁজে পাচ্ছি না। .NET 4.5 সমর্থন ট্রি এক্সপ্রেশন ট্রি?
vabii

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

15

পারফরম্যান্সের উল্লেখ করে আমি এখনও কোনও উত্তর দেখতে পাচ্ছি না। Func<>এর মধ্যে পাস করা Where()বা Count()খারাপ। বাস্তব খারাপ। আপনি যদি এটি ব্যবহার করেন Func<>তবে এটি IEnumerableপরিবর্তে লিনকিউ স্টাফকে কল করে IQueryable, যার অর্থ পুরো টেবিলগুলি টানতে হবে এবং তারপরে ফিল্টার করা হবে। Expression<Func<>>উল্লেখযোগ্যভাবে দ্রুততর, বিশেষত যদি আপনি এমন একটি ডাটাবেস অনুসন্ধান করছেন যা অন্য সার্ভারে বাস করে।


এটি কি ইন-মেমরি ক্যোয়ারিতেও প্রযোজ্য?
stt106

@ stt106 সম্ভবত না।
mhenry1384

আপনি যদি তালিকাটি গণনা করেন এটি কেবল সত্য। আপনি যদি getEnumerator বা পূর্বাচ ব্যবহার করেন তবে আপনি সম্পূর্ণরূপে মেমরির মধ্যে অসুস্থতা লোড করবেন না।
নেলসন্ট্রুরান

1
@ stt106। যখন কোনও তালিকার <> ক্লোজ <>> তে পৌঁছে যায়, তখন এক্সপ্রেশন <ফানক <>> পাওয়া যায় it এটির জন্য কম্পাইল () কল করা হয়েছে, সুতরাং ফানক <> প্রায় অবশ্যই দ্রুত faster রেফারেন্সসোর্স.মাইক্রোসফট.কম
# সিস্টেমে.কোর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.