2013-02-25 5 views
7

Я пытаюсь настроить общий интерфейс для извлечения сущностей из репозитория. Проблема в том, что мне нужно запрашивать данные из службы WCF, а Generics не работают с контрактами операций, из того, что я вижу.Entity Framework и 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

+0

Кроме того, когда я пытаюсь '.Cast (MyBaseType>' я получаю исключение. 'Не может создайте DbSet из не-общего DbSet для объектов типа «MyDerivedType». – Gabe

+0

@Gabe вы можете поделиться тем, что именно вы делаете? –

Смежные вопросы