का उपयोग कर एक फिल्टर के रूप में कार्य करने के लिए एक कस्टम विधेय बिल्डिंग मैं उन्हें कि मैं गतिशीलनिर्माण के लिए संघर्ष कर रहा हूँ एक foreach
पाश का उपयोग कर एक कस्टम फ़िल्टर को पास करके दस्तावेजों की एक सूची फिल्टर करने के लिए की जरूरत है:एक foreach पाश
var mainPredicate = PredicateBuilder.True<Document>();
// mainPredicate is combined to other filters successfully here ...
var innerPredicate = PredicateBuilder.False<Document>();
foreach (var period in periods)
{
var p = period;
Expression<Func<Document, bool>> inPeriod =
d => d.Date >= p.DateFrom && d.Date <= p.DateTo;
innerPredicate = innerPredicate.Or(d => inPeriod.Invoke(d));
}
mainPredicate = mainPredicate.And(innerPredicate);
यह अंतिम पंक्ति:
:documents = this.ObjectSet.AsExpandable().Where(mainPredicate).ToList();
इस अपवाद फेंकता
पैरामीटर 'डी' निर्दिष्ट LINQ से इकाइयों क्वेरी अभिव्यक्ति में बाध्य नहीं था।
कोई भी जानता है कि मुझे यह अपवाद क्यों मिल रहा है? मैं समझ नहीं पा रहा हूं कि 'डी' पैरामीटर जहां मैं इनपीरियोड विधि में जा रहा हूं, खो जाता है। मुझे नहीं पता कि काम करने के लिए क्या गुम है। मेरा कोड कई अन्य उदाहरणों जैसा ही है जो पूरी तरह से काम करते हैं। अभिव्यक्तियों का आह्वान करने और दृश्यों के पीछे यह कैसे काम करता है, इसके बारे में कोई भी अतिरिक्त थ्योरीय थ्योरिक जानकारी स्वागत है।
क्या होता है यदि आप 'mainPredicate.Expand()। संकलित()। (कुछ दस्तावेज़) आमंत्रित करें? क्या आप सुनिश्चित हैं कि समस्या कहीं और नहीं है (आपका कोड मुझे ठीक लग रहा है)? – svick
आपके सुझाव को देखते हुए, मैंने अंतिम पंक्ति को संशोधित किया है, इसलिए ऐसा लगता है: 'documentEntries = this.ObjectSet.AsExpandable()। जहां (de => mainPredicate.Expand()। संकलित()। Invoke (de))। ToList (); लेकिन यह फेंकता है: LINQ से संस्थाएं 'Boolean Invoke (Remabec.PM.Tarification.DocumentEntry)' विधि को पहचान नहीं पाती हैं, और इस विधि को स्टोर अभिव्यक्ति में अनुवादित नहीं किया जा सकता है। –
हाँ, यह काम नहीं करेगा और मेरा मतलब यह नहीं था। क्या आप अपना कोड स्वयं ही निष्पादित करने का प्रयास कर सकते हैं? – svick