Esto debería funcionar para EF6 pero estaba probando en EFCore.
Yo he hecho algo similar a esto cuando he necesitado modificar todos los DbSets que implementar una interfaz específica.
Usted tiene dos opciones para su situación. Dado que todos los de su modelo de tipos no tienen una base común de tipo (aparte de object
), podría refactorizar esas clases generadas para extraer las propiedades comunes a una clase base (la Id
, Name
y Type
propiedades).
Aquí estoy asumiendo que tu Coffee1
y Coffee2
las tablas sólo tiene el tipo de entidad Coffee1
y Coffee2
respectivamente.
Opción 1:
Refactorizar clases y extraer las propiedades comunes
public partial class Coffee1 : BaseCoffee {}
public partial class Coffee2 : BaseCoffee {}
public abstract class BaseCoffee
{
public int Id { get; set; }
public string Name { get; set; }
public string Type { get; set; }
}
haga su consulta tendría este aspecto
var dbSets = ctxCoin.GetType().GetProperties()
.Where(p => p.PropertyType.IsAssignableTo(typeof(IQueryable<BaseCoffee>)))
.Select(set => set.GetValue(ctxCoin))
.Cast<IQueryable<BaseCoffee>>();
var coffeeList = new ObservableCollection<GenericCoffeeList>();
foreach (var coffee in dbSets)
{
var query = coffee.Select(c => new GenericCoffeeList { CoffeeCatalogId = c.Id, Name = c.Name, Type = c.Type });
foreach (var c in query)
{
coffeeList.Add(c);
}
}
Esta opción es mucho más seguro y menos propenso a errores.
Opción 2:
Utilizar la reflexión sobre IQueryable<object>
Mantener los modelos de la misma y el uso de este:
var dbSets = ctxCoin.GetType().GetProperties()
.Where(p => p.PropertyType.IsAssignableTo(typeof(IQueryable<object>)))
.Select(set => set.GetValue(ctxCoin))
.Cast<IQueryable<object>>();
var coffeeList = new ObservableCollection<GenericCoffeeList>();
foreach (var queryableObject in dbSets)
{
var query = queryableObject.Select(GenerateGenericCoffee);
foreach (var c in query)
{
coffeeList.Add(c);
}
}
El GenerateGenericCoffee
método auxiliar
GenericCoffeeList GenerateGenericCoffee(object coffeeObject)
{
var objType = coffeeObject.GetType();
return new GenericCoffeeList
{
CoffeeCatalogId = GetProperty<int>("Id"),
Name = GetProperty<string>("Name"),
Type = GetProperty<string>("Type"),
};
T GetProperty<T>(string name)
{
return (T)objType.GetProperty(name).GetValue(coffeeObject);
}
}
Si todos los modelos contienen Id
, Name
y Type
usted estará bien en lo contrario, tendrá que comprobar las propiedades que existen antes de hacer el GenericCoffeeList
elemento.