2013-02-25 102 views
7

我想設置一個通用接口來從存儲庫檢索實體。 問題是我需要從WCF服務請求數據,而泛型不能與操作契約一起使用,從我所看到的情況來看。實體框架和DbSet

所以我這裏面的一個控制檯應用程序,工作不使用服務電話:

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屬性僅顯示當前執行範圍內的上下文,而不顯示存儲庫中包含的內容。

所以我希望有一個WCF合同是這樣的:

[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) 
{ 

} 

任何想法的最佳方法?

回答

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 2013-02-25 16:17:40

+0

時也上需要一個字符串PARAM,當我嘗試'.Cast(MyBaseType>'我得到一個異常。'無法從非泛型DbSet爲'MyDerivedType'類型的對象創建一個DbSet .' – Gabe 2013-02-25 16:19:02

+0

@Gabe你能分享一下你到底在幹什麼嗎? – 2013-02-25 16:21:02