2015-06-15 9 views
5

Biorąc pod uwagę następujący uproszczony kontekst 6 kontekstu jednostki, próbuję wypełnić listę podmiotami, ale mając problemy z odbiciem (jak sądzę) poprzez refleksję.Jak rzucić DbSet <T> na listę <T>

public class FooContext : DbContext 
{ 
    public virtual IDbSet<FooClass> Foo { get; set; }  
    //... 
} 

public class FooClass 
{ 
    public int Id{ get; set; } 
    public string Name {get; set; } 
    //...  
} 

public main() 
{ 
    using (var context = new FooContext()) 
    { 
     var sets = typeof(FooContext).GetProperties().Where(pi => pi.PropertyType.IsInterface && pi.PropertyType.GetGenericTypeDefinition().ToString().ToLower().Contains("idbset")); 

     foreach (var set in sets) 
     { 
      //When I debug and enumerate over 'value' the entire results are shown so I believe the reflection part is OK. 
      var value = set.GetValue(context, null); 

      //Always returns null. How can I cast DbSet<T> to List<object> or List<T>? 
      var list = value as List<object>(); 

      //... 
     } 
    } 
} 

Robię to dla metody użyteczności dla niektórych testów integracyjnych, które robię. Próbuję to zrobić bez korzystania z bezpośrednich wywołań SQL inline (przy użyciu SqlConnection i SqlCommand itp.), Aby uzyskać dostęp do bazy danych (jak datastore może zmienić na Oracle itp.).

+1

Możesz rzutować na interfejs "IEnumerable" –

+0

'set.GetValue (context, null)' zwraca 'object'. Próbujesz przesłać go do' List '. –

+2

'DbSet <>' nie jest listą *, a ani 'DbSet ' ani 'List ' nie jest listą 'List '. To, co próbujesz zrobić, jest skazane na zagładę. Czy możesz wyjaśnić swoje zamiary? Czego chcesz * robić *? –

Odpowiedz

5

IDBSet dziedziczy IQueryable<TEntity>, IEnumerable<TEntity>, IQueryable i IEnumerable, więc nie można bezpośrednio rzucić go do listy w ten sposób. Można dostać List<TEntity> wszystkich podmiotów w DBSet choć za pomocą .ToList() lub .ToListAsync()

to tworzy kopię wszystkich podmiotów w pamięci choć, więc należy rozważyć pracy z LINQ bezpośrednio na DBSet

1

Można Rzuć to. Wystarczy utworzyć nową List<T> od ciebie DbSet poprzez ToListAsync<T>() z IQueryable wyliczając je asynchronicznie lub po prostu poprzez synchronicznie ToList()

Także myślę, lepiej stworzyć konkretną realizację dla swoich scenariuszy. Teraz utwórz dla EF. Kiedy zaczniesz używać NHibernate, na przykład utwórz test dla niego i tak dalej. Dla przyszłego wsparcia będzie to prostsze, a następnie próba stworzenia czegoś ogólnego, co będzie bardziej skomplikowane w przypadku naprawy i debugowania.

FYI, czy jesteś pewien, że potrzebujesz tych testów integracyjnych? Może lepiej przetestować, czy twoje odwzorowania/implementacje działają z bazą danych. Myślę, że będzie to ważniejsza część. Oczywiście, jeśli wcześniej tego nie robiłeś.

5
//dont forget using System.Linq; 
using (var context = new FooContext()) 
{ 
    IQueryable<FooClass> rtn = from temp in context.Foo select temp; 
    var list = rtn.ToList(); 
} 
0
private StudentDatabaseEntities db = new StudentDatabaseEntities(); 

public List<StudentDatabaseDbTableModel> AllProducts() 
{ 
    return db.StudentDatabaseDbTableModel.ToList(); 
} 

db.StudentDatabaseDbTableModel jest typu DbSet. ToList jest metodą wewnątrz klasy DbSet. Metoda ToList konwertuje obiekt typu DbSet na typ listy.

+0

Chociaż ten fragment kodu może rozwiązać pytanie, [w tym wyjaśnienie] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-ans -answers) naprawdę pomaga poprawić jakość twojego postu. Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. – DimaSan

+0

Nie ma takiej metody 'ToList()' w DbSet. –

Powiązane problemy