5

मैं एक ईएफ 4.2 कोड पहले मॉडल का उपयोग कर एक परियोजना पर काम कर रहा हूं। इस मॉडल में उत्पादों के लिए एक टीपीएच विरासत संरचना शामिल है। मुझे भेदभावकर्ता पर इस विरासत मॉडल के पॉलीमोर्फिक परिणामों को समूहित करने की आवश्यकता है और कुछ मुद्दों में चल रहा हूं।एंटीटी फ्रेमवर्क 4.2 तालिका प्रति पदानुक्रम समूह भेदभावकर्ता

इकाई ढांचा इस समूह को पूरा करने के लिए भेदभावकर्ता का पर्दाफाश नहीं करता है। मेरा पहला सवाल यह है कि क्या मुझे इस भेदभावकर्ता की सीधी पहुंच मिल सकती है? मेरा पठन और अनुभव मुझे नहीं बता रहा है, इसलिए मैं इस समाधान के साथ आया कि कामों की तरह। यह अच्छा प्रदर्शन नहीं कर रहा है और मुझे इस बात से प्रसन्नता नहीं है कि इसे कैसे बनाए रखा जाना चाहिए।

Public MustInherit Class Product 
     <key()> 
     Public Property ProductID as integer 

     <StringLength(50, ErrorMessage:="Max 50 characters")> 
     <Required(ErrorMessage:="Product name is required")> 
     Public Property Name as String 

     <TimeStamp()> 
     Public Property Time_Stamp as DateTime = DateTime.Now() 
End Class 

Public Class Desktop 
     Inherits Product 

     <StringLength(50, ErrorMessage:="Max 50 characters")> 
     <Required(ErrorMessage:="Processor is required")> 
     Public Property Processor as String 
End Class 

Public Class Monitor 
     Inherits Product 

     <Required(ErrorMessage:="Monitor size is required")> 
     Public Property Size_Inches as Integer 
End Class 

मैं एक विस्तार विधि है कि एक उत्पाद लेता है और यह एक स्ट्रिंग के रूप basetype नाम है रिटर्न बनाया:

मेरे कक्षाएं कुछ इस तरह (सरलीकृत) देखो।

<Extension()> 
Public Function ProductType(ByVal inProduct as Product) as String 
     ProductType = inProduct.GetType().BaseType.Name 
End Function 

कि के साथ, मैं प्रकार के आधार पर समूह को यह संरचना का निर्माण उत्पाद के परिणाम तो मैं उन के माध्यम से चला सकते हैं:

Dim tmpProducts = db.Products.ToList() 
Dim GrpProducts = tmpProducts.GroupBy(Function(prod) prod.ProductType) _ 
          .Select(Function(s) New With {.ProductType = S.Key, 
                  .Products = S }) 

मैं अब सूची के माध्यम से पाश व्यवहार मैं चाहता हूँ प्राप्त करने के लिए कर सकते हैं, लेकिन प्रदर्शन आदर्श नहीं है और मुझे चिंता है कि उत्पादों की संख्या बढ़ने के कारण यह अस्वीकार्य होगा।

For Each ProductGroup in GrpProducts 
     Dim TypeName as String = ProductGroup.ProductType 
     Dim TypeProducts = ProductGroup.Products 
Next 

इसके अलावा, यह मेरे साझा गुण (नाम) के लिए आसान पहुँच दे सकते हैं लेकिन अब मैं कई विकल्प उनके वास्तविक प्रकार, हो सकता है TypeName के चारों ओर एक चयन के मामले में इन कास्ट करने के लिए नहीं है। । ।

किसी भी सिफारिश की सराहना की जाती है, कृपया उपरोक्त किसी भी कोड त्रुटियों को क्षमा करें, मैंने स्मृति से उदाहरणों को दोबारा हटा दिया क्योंकि मुझे इस समय परियोजना तक पहुंच नहीं है।

उत्तर

2

एक समाधान थोड़ा और मॉडल करना होगा, और एक नई इकाई ProductType एक संपत्ति Name है। फिर आपके पास Product और ProductType के बीच एक साधारण 1-एन संबंध होगा। मैंने EntityFramework का उपयोग नहीं किया है, लेकिन NHibernate के साथ आप आसानी से फ्रेमवर्क को क्वेरी पर उस तालिका में शामिल कर सकते हैं, ताकि यह प्रत्येक Product के लिए ProductType के लिए प्रॉक्सी वापस नहीं करेगा, जो प्रदर्शन को नुकसान पहुंचा सकता है।

एक ऐड-ऑन, भविष्य ProductType में, अन्य रोचक गुण (जैसे मानों कि ProductType के हर Product के लिए आम बात है के रूप में) को विकसित कर सकता है, तो यह अपने समाधान करने के लिए लचीलापन कहते हैं, हालांकि यह के तत्काल लागत है के रूप में अपने डेटाबेस में एक और टेबल जोड़ना।

+0

यह निश्चित रूप से एक विकल्प है के द्वारा समूह को हल करने के लिए एक रास्ता मिलना चाहिए हालांकि मैं सामान्य गुणों महसूस प्रकार परिभाषा पर हैं जब संभव। हाल ही में मैं बेस क्लास में एक उत्पादित "ProductTypeName" संपत्ति जोड़ रहा हूं। Cludgy लगता है और संग्रहीत डेटा दोहराता है लेकिन यह बेहतर प्रदर्शन करता है। – sgrade1979

1

LINQ क्वेरी के बाद, आप discriminator

from a in db.Records 
group a.ID by new 
{ 
    Name= a is Audio ? "Audio" : 
      a is Video ? "Video" : 
      a is Picture ? "Picture" : 
      a is Document ? "Document" : "File" 
} into g 
select new 
{ 
    Name = g.Key.Name, 
    Total = g.Count() 
} 
संबंधित मुद्दे