Dado el siguiente contexto simplificado de Entity Framework 6, estoy tratando de completar una Lista con las entidades pero tengo problemas con la forma de emitir (creo) a través de la reflexión.
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>(); //... } } }Estoy haciendo esto como método de utilidad para algunas pruebas de integración que estoy haciendo. Estoy tratando de hacer esto sin usar llamadas SQL en línea directas (usando SqlConnection y SqlCommand, etc.) para acceder a la base de datos (ya que el almacén de datos puede cambiar a Oracle, etc.).
IDBSet hereda de IQueryable<TEntity> , IQueryable<TEntity> , IEnumerable<TEntity> IQueryable , IEnumerable lo que no puede convertirlo directamente en una lista de esa manera. Sin embargo, podría obtener una List<TEntity> de todas las entidades en el DBSet usando .ToList() o .ToListAsync()
Sin embargo, esto crea una copia de todas las entidades en la memoria, por lo que debería considerar operar con LINQ directamente en el DBSet.
//dont forget using System.Linq; using (var context = new FooContext()) { IQueryable<FooClass> rtn = from temp in context.Foo select temp; var list = rtn.ToList(); }Junto con la respuesta de VicYam, aquí hay una forma más fácil con una explicación detallada.
Una vez que agregue el espacio de nombres System.Linq , ya no necesitará obtener IQueryable y luego convertirlo a List . En su lugar, obtendrá los métodos de extensión en el objeto DbSet .
¿Qué significa esto? Simplemente puede devolver el DbSet por sí mismo, ya que hereda de IEnumerable . El consumidor, posiblemente un desarrollador, puede hacer un .ToList o cualquier otro tipo de lista que pueda necesitar.
más fácil
Esto devolverá el DbSet tal como está, que ya hereda de IEnumerable que es un tipo de lista que luego se puede convertir en List .
List<ObjectType> list = new List<ObjectType>(); using (var context = new FooContext()) { list = context.Foo; }Alternativa
Puede convertir inmediatamente de IEnumerable a List .
using (var context = new FooContext()) { var list = context.Foo.ToList(); }¿Todavía quiere la respuesta de VicYam pero como una sola línea?
using (var context = new FooContext()) { var list = context.Foo.AsQueryable().ToList(); }