इस के लिए काम करना चाहिए EF6 लेकिन मैं परीक्षण पर EFCore.
मैं कुछ किया है के लिए कुछ इसी तरह, जब मैं इस जरूरत को संशोधित करने के लिए सभी DbSets को लागू है कि एक विशिष्ट इंटरफेस ।
आप दो विकल्पों में अपनी स्थिति के लिए. के बाद से अपने सभी मॉडल के प्रकार नहीं है एक सामान्य आधार प्रकार (अन्य की तुलना में object
), तुम सकता है refactor उत्पन्न उन वर्गों को निकालने के लिए आम गुण के लिए एक आधार वर्ग (के Id
, Name
है , और Type
गुण).
मैं यहाँ मान रहा हूँ अपने Coffee1
और Coffee2
मेज सिर्फ इकाई प्रकार Coffee1
और Coffee2
क्रमश:.
विकल्प 1:
Refactor वर्गों और निकालने के उन आम गुण
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; }
}
तो आपकी क्वेरी इस तरह दिखेगा
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);
}
}
इस विकल्प को अधिक प्रकार सुरक्षित और कम त्रुटि प्रवण है.
विकल्प 2:
उपयोग पर प्रतिबिंब IQueryable<object>
रखने के अपने मॉडल को ही है और इस का उपयोग करें:
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);
}
}
के GenerateGenericCoffee
सहायक विधि
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);
}
}
अगर सभी अपने मॉडल के होते हैं Id
, Name
है , और Type
, आप ठीक हो जाएगा अन्यथा आप की आवश्यकता होगी करने के लिए उन लोगों की जांच गुण मौजूद हैं पहली बनाने से पहले GenericCoffeeList
आइटम.