2010-07-29 19 views
9

मेरे पास एक इकाई फ्रेमवर्क मॉडल (v.1.0) है जो मैं एक गणना की गई संपत्ति के साथ विस्तार करने की कोशिश कर रहा हूं।इकाई फ्रेमवर्क परिकलित संपत्ति समस्या

मैं इस तरह से इकाई वस्तु "प्रस्ताव" विस्तार करने के लिए आंशिक वर्ग बना लिया है:

namespace MyModelNamespace 
{ 
    public partial class Offer 
    { 
     public bool MyProperty 
     { 
      get 
      { 
       // my stuffs the return true or false 
      } 
     } 
    } 
} 

यह मेरी विधानसभा में समस्या के बिना संकलित है, लेकिन क्रम में, जब मैं कुछ करने के लिए कोशिश कर रहा हूँ इस तरह:

_myEntities.OfferSet.FirstOrDefault(o=>o.MyProperty); 

मैं इस त्रुटि को पुनः प्राप्त:

The number of members in the conceptual type 'MyModelNamespace.Offer' does not match with the number of members on the object side type 'MyModelNamespace.Offer'. Make sure the number of members are the same.

... किसी भी सुझाव ???

उत्तर

5

हाँ, आप यह कर सकते हैं। LINQ translations library का उपयोग करें।

+0

दिलचस्प ... मैं जितनी जल्दी हो सके कोशिश करूंगा! – tanathos

+2

मैं इसे आजमा रहा हूं, लेकिन मैं इसे काम नहीं कर सकता :(... मैंने डीएलएल शामिल किया है, और यह अच्छी तरह से संकलित है, लेकिन रनटाइम पर मुझे कुछ मिलता है: "निर्दिष्ट सदस्य 'माइप्रोपर्टी' द्वारा समर्थित नहीं है LINQ से Entities। "मैंने आपके द्वारा पोस्ट किए गए लिंक में उदाहरणों का बिल्कुल पालन किया है। – tanathos

+0

@tanathos आपकी समस्या को स्थिर प्रारंभिकरण के साथ करना होगा। उस लेख पर 30 अगस्त से मैटियास बोरोस की टिप्पणी देखें।वहां प्रस्तावित कार्यवाही वर्ग पर एक खाली (खाली) स्थैतिक कन्स्ट्रक्टर बनाना है, और उसके बाद पूछे जाने से कुछ समय पहले ऑब्जेक्ट का एक उदाहरण तत्काल करना है। बदसूरत :( – AaronSieb

1

आप कस्टम गुणों को डेटाबेस में नीचे नहीं दबा सकते हैं। आपको

"The specified type member 'MyProperty' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported."

जो कुछ भी आप चाहते हैं उसे करने का एकमात्र वैध तरीका इसे स्मृति में प्राप्त करना चाहिए था। और फिर फ़िल्टर करें।

_myEntities.OfferSet.ToList().FirstOrDefault(o=>o.MyProperty); 

मुझे लगता है कि आप जो कुछ भी कर रहे हैं उसे पूरा करने का शायद एक बेहतर तरीका है।

संपादित करें मैं सहमत हूं कि क्रेग एक और तरीका है, मानते हुए * इसे स्टोर अभिव्यक्ति में अनुवादित किया जा सकता है। यदि आप किसी प्रकार की क्वेरी में किसी संपत्ति का मानचित्रण कर रहे हैं, तो आप फ़िल्टर को खोज/पुश करने में सक्षम होंगे।

+0

एकमात्र रास्ता नहीं; मेरा जवाब देखें –

+0

आप सही हैं, मुझे लगता है कि वह कुछ प्रकार की निरंतर या व्युत्पन्न संपत्ति का उपयोग करने की कोशिश कर रहा था। – Nix

+0

'इस मामले में' toList() 'से अधिक संख्यात्मक()' बेहतर है। –

0

एक तरीका जिस तरह से आप कोशिश कर सकते हैं System.Linq.Expressions नेमस्पेस और AsExpandable एक्सटेंशन विधि here उपलब्ध है।

मुझे लगता है कि आप FirstOrDefault विधि पर एक अभिव्यक्ति पारित कर सकते हैं, और यदि आप अभी भी MyProperty कहीं और उपयोग करना चाहते हैं, तो आप इसके मूल्य की गणना करने के लिए एक ही अभिव्यक्ति का उपयोग कर सकते हैं। तो अगर आप की तरह कुछ होगा:

public partial class Offer 
{ 
    public static Expression<Func<Offer, bool>> exp 
    { 
     get 
     { 
      return o => o.Property1 * o.Property2 == someValue; 
     } 
    } 

    public bool MyProperty 
    { 
     get 
     { 
      return exp.Compile()(this); 
     } 
    } 
} 
फिर

बाद में, आप उस में पारित:

_myEntities.OfferSet.AsExpandable().FirstOrDefault(Offer.exp.Compile())); 

अपने गणना एक अभिव्यक्ति पेड़ कि SQL समझता में बदला जा सकता है, तो मुझे लगता है कि यह काम करेगा । यह एक गैर-इकाई परीक्षण कक्षा के साथ काम करता था, लेकिन LINQ से इकाइयों के साथ इसका उपयोग एक अलग जानवर है।

मैंने AsExpandable का उपयोग नहीं किया है, इसलिए यह कोड सही नहीं हो सकता है। मैं सुधार के लिए खुला हूँ।

+0

'माईफंक्क' को 'अभिव्यक्ति

+0

अच्छा बिंदु। जिसका अर्थ है कि लैम्ब्डा को अभिव्यक्ति होना चाहिए एक बयान ब्लॉक का, इसलिए मुझे उम्मीद है कि गणना इस तरह व्यक्त की जा सकती है। संपादित। –

संबंधित मुद्दे