2010-04-08 9 views
5

मेरे पास एक इकाई है जो मेरे ऑब्जेक्ट के सभी लोगों द्वारा विरासत में है। मैं गतिशील लिंक का उपयोग कर रहा हूं और कुछ सामान्य प्रश्नों को काम करने की कोशिश कर रहा हूं।गतिशील लिंक मदद, पैरामीटर के रूप में पारित वस्तु के आधार पर विभिन्न त्रुटियों?

मैं अपने EntityDao में मेरी सामान्य विधि में निम्नलिखित कोड है:

public abstract class EntityDao<ImplementationType> where ImplementationType : Entity 
{ 
    public ImplementationType getOneByValueOfProperty(string getProperty, object getValue){ 
    ImplementationType entity = null; 
    if (getProperty != null && getValue != null) 
    { 
     LCFDataContext lcfdatacontext = new LCFDataContext(); 
     //Generic LINQ Query Here 
     entity = lcfdatacontext.GetTable<ImplementationType>().Where(getProperty + " [email protected]", getValue).FirstOrDefault(); 
     //.Where(getProperty & "==" & CStr(getValue)) 
    } 

//lcfdatacontext.SubmitChanges() 
//lcfdatacontext.Dispose() 

return entity; 
} 

तो मैं एक इकाई परीक्षण में निम्न विधि कॉल (मेरे सारे objectDaos entityDao वारिस) है:

[Test] 
public void getOneByValueOfProperty() 
{ 
    Accomplishment result = accomplishmentDao.getOneByValueOfProperty 
     ("AccomplishmentType.Name", "Publication"); 

    Assert.IsNotNull(result); 
} 

उपरोक्त पास (समापन प्रकार का पूरा करने का संबंध है)

Accomplishment result = accomplishmentDao.getOneByValueOfProperty("Description", "Can you hear me now?"); 
Accomplishment result = accomplishmentDao.getOneByValueOfProperty("LocalId", 4); 

उपरोक्त दोनों कार्य। हालांकि,

Accomplishment result = accomplishmentDao.getOneByValueOfProperty 
    ("Id", New Guid("95457751-97d9-44b5-8f80-59fc2d170a4c")); 

काम नहीं करता है और कहता है निम्नलिखित:

Operator '=' incompatible with operand types 'Guid' and 'Guid 

हो रहा क्यों है? Guid की तुलना नहीं की जा सकती है? मैंने == के साथ-साथ एक ही त्रुटि की कोशिश की। क्या और भी बहुत भ्रामक है कि मैंने देखा है गतिशील Linq के हर उदाहरण बस तार पैरामिट्रीकृत जहां विधेय या आप इसका उपयोग क्या मैं बाहर टिप्पणी की है usings है: के साथ या बिना CSTR

//.Where(getProperty & "==" & CStr(getValue)) 

, कई डेटाटाइप्स काम नहीं करते इस प्रारूप के साथ। मैंने getValue को किसी ऑब्जेक्ट की बजाय स्ट्रिंग में सेट करने का प्रयास किया, लेकिन फिर मुझे अलग-अलग त्रुटियां मिलती हैं (जैसे कि मल्टीवर्ड स्ट्रिंग पहले शब्द के बाद तुलना बंद कर देगी)।

यह काम GUIDs और/या किसी भी डेटा प्रकार के साथ करने के लिए मुझे क्या याद आ रही है? आदर्श रूप से मैं ऑब्जेक्ट के बजाय getValue (जैसा कि मैंने हर दूसरे गतिशील LINQ उदाहरण के लिए देखा है) के लिए एक स्ट्रिंग में बसने में सक्षम होना चाहते हैं और कॉलम के डेटा प्रकार के बावजूद यह काम करता है।

उत्तर

6

वेल्प मैंने इसे समझ लिया, डायनामिक LINQ प्रारंभ में GUID की तुलना का समर्थन नहीं करता है (इसलिए बेवकूफ!)। https://connect.microsoft.com/VisualStudio/feedback/details/333262/system-linq-dynamic-throws-an-error-when-using-guid-equality-in-where-clause

तुम बस एक संपादन Dynamics.cs में जाना है, तो निम्न साथ IEqualitySignatures इंटरफेस की जगह:

interface IEqualitySignatures : IRelationalSignatures 
{ 
    void F(bool x, bool y); 
    void F(bool? x, bool? y); 
    void F(Guid x, Guid y); 
    void F(Guid? x, Guid? y); 
} 

अब मेरी getOneByValueOfProperty हर समय काम करता है मैं इस छोटे से tidbit मिल गया!

0
के लिए

Guid इस काम करना चाहिए:

.Where(getProperty + ".Equals(@0)", getValue); 

(ध्यान दें पैरामीटर getValue प्रकार की होनी चाहिए Guid)

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