To by mělo fungovat pro EF6, ale byl jsem testování na EFCore.
Udělal jsem něco poněkud podobné s tím, když jsem potřeboval upravit všechny DbSets, které implementují určité rozhraní.
Máte dvě možnosti pro vaši situaci. Od všech vašich model typy nemají společný základní typ (jiné než object
), můžete refaktorovat ty generované třídy extrahovat společné vlastnosti základní třídy ( Id
, Name
a Type
vlastnosti).
Tady předpokládám, že vaše Coffee1
a Coffee2
tabulky jen typ entity Coffee1
a Coffee2
resp.
Možnost 1:
Refaktorovat tříd a extrakt tyto společné vlastnosti
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; }
}
pak se váš dotaz bude vypadat takto
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);
}
}
Tato možnost je mnohem více typů-bezpečné a méně náchylné k chybám.
Možnost 2:
Použití reflexe IQueryable<object>
Udržujte své modely stejné a použít toto:
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);
}
}
Na GenerateGenericCoffee
pomocník metoda
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);
}
}
Pokud všechny své modely obsahují Id
, Name
a Type
budeš v pohodě , jinak budete muset zkontrolovat tyto vlastnosti existují první před provedením GenericCoffeeList
položka.