2013-02-25 15 views
7

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

public virtual List<T> GetAll<T>() where T : MyBaseType 
{ 
    return this.datacontext.Set<T>().Include(l => l.RelationshipEntity).ToList(); 
} 

एक ही रास्ता मैं डोंग देख सकते हैं कुछ इस तरह होगा::

public virtual List<MyBaseType> GetAll(Type entityType) 
{ 
    return this.datacontext.Set(entityType).Include(l => l.RelationshipEntity).ToList(); 
} 

Set<T>() और

तो मैं जो एक सांत्वना आवेदन में काम करता है, एक सेवा कॉल का उपयोग नहीं इस राशि Set(Type type) दोनों DbSet लौटाते हैं, लेकिन Set(Type type) में ToList() का उपयोग करने का विस्तार नहीं है, और न ही मुझे अपने सभी परिणाम वापस मिलते हैं।

Local संपत्ति केवल वर्तमान निष्पादन के दायरे में संदर्भ दिखा रही है, न कि भंडार में क्या है।

[ServiceContract] 
public interface IRulesService 
{ 
    [OperationContract] 
    MyBaseType Add(MyBaseType entity); 

    [OperationContract] 
    List<MyBaseType> GetAll(Type type); 
} 

फिर कार्यान्वयन:

public virtual List<MyBaseType> GetAll(Type entityType) 
{ 
    var dbset = this.datacontext.Set(entityType); 
    string sql = String.Format("select * from {0}s", type.Name); 

    Type listType = typeof(List<>).MakeGenericType(entityType); 
    List<MyBaseType> list = new List<MyBaseType>(); 

    IEnumerator result = dbset.SqlQuery(sql).GetEnumerator(); 

    while (result.MoveNext()){ 
     list.Add(result.Current as MyBaseType); 
    } 

    return list; 
} 

//public virtual List<T> GetAll<T>() where T : MyBaseType 
//{ 
// return this.datacontext.Set<T>().Include(l => l.RelationshipEntity).ToList(); 
//} 

public virtual MyBaseType Add(MyBaseType entity) 
{ 
    DbSet set = this.datacontext.Set(typeof(entity)); 
    set.Add(entity); 
    this.datacontext.SaveChanges(); 
    return entity; 
} 

//public virtual T Add<T>(T t) where T : MyBaseType 
//{ 
// this.datacontext.Set<T>().Add(t); 
// this.datacontext.SaveChanges(); 
// return t; 
//} 

public virtual List<MyBaseType> UpdateAll(List<MyBaseType> entities) 
{ 

} 

कोई भी विचार सबसे अच्छा तरीका

तो मैं इस तरह एक WCF अनुबंध करना चाहते हैं?

उत्तर

0

आपको Cast<T> एक्सटेंशन विधि पर कॉल करने में सक्षम होना चाहिए।

public virtual List<MyBaseType> GetAll(Type entityType) 
{ 
    return this.datacontext.Set(entityType) 
     .Include(l => l.RelationshipEntity) 
     .Cast<MyBaseType>() // The magic here 
     .ToList(); 
} 
+0

'.Include()' पर एक स्ट्रिंग परम जब 'DbSet (प्रकार)' विधि ... – Gabe

+0

इसके अलावा का उपयोग कर लेता है, जब मैं कोशिश '.Cast (MyBaseType>' आई कैन एक अपवाद मिलता है। 'नहीं 'MyDerivedType' प्रकार की वस्तुओं के लिए गैर-जेनेरिक डीबीसेट से एक डीबीसेट बनाएं। – Gabe

+0

@Gabe क्या आप साझा कर सकते हैं कि आप वास्तव में क्या कर रहे हैं? –

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