Acest lucru ar trebui să lucreze pentru EF6 dar am fost de testare pe EFCore.
Am făcut ceva oarecum similar cu acest lucru atunci când am nevoie să modificați toate DbSets care implementează o anumită interfață.
Aveți două opțiuni pentru situația dumneavoastră. Deoarece toate tipurile de modele nu au o bază comună de tip (altele decât object
), ai putea refactor cele generate clase pentru a extrage proprietățile comune la o clasă de bază (de Id
, Name
și Type
proprietăți).
Aici eu sunt presupunând Coffee1
și Coffee2
mesele trebuie doar tipul de entitate Coffee1
și Coffee2
respectiv.
Opțiunea 1:
Refactor clase și extrage acele proprietăți comune
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; }
}
apoi interogare ar arata astfel
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);
}
}
Această opțiune este mai mult de tip în condiții de siguranță și mai puțin predispuse la erori.
Opțiunea 2:
Utilizați reflecție asupra IQueryable<object>
Păstrați modele la fel și de a folosi asta:
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);
}
}
La GenerateGenericCoffee
metoda de ajutor
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);
}
}
Dacă toate de modele conțin Id
, Name
și Type
,, va fi bine, altfel va trebui să verificați acele proprietăți exista mai întâi înainte de a face GenericCoffeeList
element.