7

リポジトリからエンティティを取得するための汎用インターフェイスを設定しようとしています。問題は、WCF サービスからデータを要求する必要があり、Generics が操作コントラクトで機能しないことです。

だから私は、サービスコールを使用せずに、コンソールアプリケーションで動作するこれを持っています:

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)どちらもがを返しますがDbSetSet(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)
{

}

最善のアプローチのアイデアはありますか?

4

1 に答える 1

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();
}
于 2013-02-25T16:15:09.483 に答える