c# - DLINQ projecting into concrete types with expression trees -
मेरे पास खरीद
वर्ग
सार्वजनिक के लिए एक अभिव्यक्ति का पेड़ है स्थिर पढ़ने के लिए अभिव्यक्ति & lt; फ़नक & lt; खरीद, डबल? & Gt; & gt; वर्तमान पेडसम्मेलंबडा = पी = & gt; (डबल?) पी। भुगतान। जहां (पीए = & gt; pa.Status == सिस्टमकस्टमेंट। भुगतान स्टेटस। भुगतान) .सम (पीए = & gt; pa.SUM);
मैं एक प्रकार में प्रक्षेपण बनाना चाहते PurchaseSummaryInfo
इस
वर ps = Db.Purchases.Select (पी की तरह = & gt; नई PurchaseSummaryInfo {paidSum = (? डबल) p.Payments .Where (PA = & gt; pa.Status == SystemConstants.PaymentStatus.Paid) .sum (PA = & gt; pa.Sum) ?? 0});
लेकिन मेरे "पूर्व डिब्बाबंद" अभिव्यक्ति के पेड़ का उपयोग करने के लिए।
क्या यह किया जा सकता है, और यदि हां - कैसे?
हमें एक संयोजन
विधि की आवश्यकता होगी। इस विधि एक अभिव्यक्ति है कि एक मूल्य के एक दूसरे अभिव्यक्ति है कि पहले अभिव्यक्ति के रूप में एक ही इनपुट स्वीकार करता है स्वीकार करता है और एक मध्यवर्ती परिणाम की गणना करता है, और फिर, ले जाएगा एक दूसरे पैरामीटर के रूप में मध्यवर्ती परिणाम को स्वीकार करता है, और फिर एक नया मान की गणना करता है।
सार्वजनिक स्थिर अभिव्यक्ति & lt; फ़नक & lt; टीप्रस्टपरम, ट्रेशल्ट & gt; & gt; (वर्क्स एंड लेफ्टिनेंट, ट्रेसस्टैम, टी इंटरस्टीट, ट्रसल्ट एंड जीटी; (इस अभिव्यक्ति और लेफ्टिनेंट; फ़ंक् & amp; एलटी; टीप्रस्टपरम, टी इंटरफ़ेसैकेट & gt; पहला, अभिव्यक्ति & amp; lt; फ़नक & lt; टीप्रस्टपरम, टी इंटरमेटीट, टीआरएसयूल्ट & gt; दूसरा) {var param = Expression.Parameter (टाइपफ (टीएफर्स्टपरम), " परम "); Var newFirst = पहले। बॉडी। जगह (पहले। पैरामीटर [0], परम); Var newSecond = second.Body.Replace (दूसरा। पैरामीटर [0], परम)। बदलें (दूसरा। पैरामीटर [1], नया फर्स्ट); वापसी अभिव्यक्ति। लैम्ब्डा & lt; Func & lt; टीप्रस्टपरम, ट्रेशल्ट & gt; & gt; (नयासेकंड, परम); }
एक कार्यान्वयन के रूप में, यह एक अभिव्यक्ति के सभी उदाहरणों को दूसरे के साथ बदलने की क्षमता पर निर्भर करता है, जिसे इस का उपयोग किया जा सकता है:
आंतरिक वर्ग विजिटर बदलें: अभिव्यक्ति विजिटर {निजी रीडोनली अभिव्यक्ति, से; सार्वजनिक ReplaceVisitor (से अभिव्यक्ति, अभिव्यक्ति करने के लिए) {this.from = से; यह; = के लिए; } सार्वजनिक ओवरराइड एक्सप्रेशन विज़िट (अभिव्यक्ति नोड) {return node == से? To: base.Visit (नोड); }} सार्वजनिक स्थैतिक अभिव्यक्ति बदलें (यह अभिव्यक्ति अभिव्यक्ति, अभिव्यक्ति खोजएक्स, एक्सप्रेशन बदलेंएक्स) {नई रीप्लेस विज़िटर (खोजएक्स, प्रतिस्थापित करें) लौटें। विज़िट करें (अभिव्यक्ति); }
तो अब हम लिख सकते हैं:
var ps = Db.Purchases.Select (CurrentPaidSumLambda.Combine ((p, sum) = & gt; नया खरीदसमुराइन्फ़ो (paidSum = sum ??)};
Comments
Post a Comment