मुझे पता है कि यह प्रश्न पहले ही पूछा जा चुका है लेकिन मुझे कोई जवाब नहीं मिला जो मुझे संतुष्ट करता है। मैं जो करने की कोशिश कर रहा हूं वह अपने प्रकार के नाम के आधार पर एक विशेष DbSet<T>
पुनर्प्राप्त करना है।डीबीसीएन्टेक्स्ट में एक सामान्य डीबीसेट ढूंढें गतिशील रूप से
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("MyDllAssemblyName")]
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("MyCallingAssemblyName")]
class MyDbContext : DbContext {
public DbSet<ModelA> A { get; set; }
public DbSet<ModelB> B { get; set; }
public dynamic GetByName_SwitchTest(string name) {
switch (name) {
case "A": return A;
case "B": return B;
}
}
public dynamic GetByName_ReflectionTest(string fullname)
{
Type targetType = Type.GetType(fullname);
var model = GetType()
.GetRuntimeProperties()
.Where(o =>
o.PropertyType.IsGenericType &&
o.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>) &&
o.PropertyType.GenericTypeArguments.Contains(targetType))
.FirstOrDefault();
if (null != model)
return model.GetValue(this);
return null;
}
}
मैं कोई परेशानी नहीं प्रकार ही है कि क्या यह एक सरल स्विच या प्रतिबिंब के माध्यम से है हो रही है:
मैं निम्नलिखित है। हालांकि मुझे गति को गतिशील के रूप में वापस करने की आवश्यकता है क्योंकि मुझे नहीं पता कि डीबीसेट प्रकार क्या होगा।
// MyDbContext MyDbContextInstance..
var model = MyDbContextInstance.GetByName_SwitchTest("A");
var record1 = model.FirstOrDefault(); // It crashes here with RunTimeBinderException
इस बिंदु model
पर एक InternalDbSet<ModelA>
प्रकार का एक उदाहरण में शामिल हैं: तो कहीं और ही विधानसभा में, मैं इसे इस तरह से इस्तेमाल करते हैं। वहाँ से, किसी भी उपयोग मैं model
वस्तु के साथ क्या मैं एक RunTimeBinderException मिलती है: 'Microsoft.Data.Entity.Internal.InternalDbSet' 'FirstOrDefault'
वेब पर जांच के लिए एक परिभाषा शामिल नहीं है, मैं एक blog post पाया यह बताता है कि (अपने ब्लॉग दीक्षित):
कारण FirstOrDefault करने के लिए कॉल() विफल रहता है कि मॉडल के प्रकार जानकारी रनटाइम पर उपलब्ध नहीं है। कारण यह उपलब्ध नहीं है क्योंकि अनाम प्रकार सार्वजनिक नहीं हैं। जब विधि उस अज्ञात प्रकार का उदाहरण लौटा रही है, तो यह सिस्टम लौटा रही है। ऑब्जेक्ट जो अज्ञात प्रकार के उदाहरण का संदर्भ देता है - टाइप करें जिसका जानकारी मुख्य प्रोग्राम में उपलब्ध नहीं है।
और फिर उसने बताते हैं कि एक समाधान:
समाधान वास्तव में बहुत सरल है।
[assembly:InternalsVisibleTo("assembly-name")]
मैं अपने कोड पर इस समाधान की कोशिश की थी, लेकिन यह काम नहीं करता: सभी हम क्या करना है ClassLibrary1 परियोजना के AssemplyInfo.cs को खोलने और उसमें निम्न पंक्ति जोड़ने है। जानकारी के लिए मेरे पास एएसपीनेट 5 समाधान है जिसमें डीएनएक्स डॉटनेट 46 पर चल रहे दो असेंबली हैं। एक ऐप और एक डीएल जिसमें मेरे सभी मॉडल और डीबीकॉन्टेक्स्ट शामिल हैं। मेरे द्वारा किए गए सभी संबंधित कॉल हालांकि डीएल पर स्थित हैं।
क्या इस समाधान के पास काम करने का कोई मौका है? क्या मुझे कुछ याद आ रही है? किसी भी पॉइंटर्स की सराहना की जाएगी?
अग्रिम धन्यवाद
[संपादित करें]
मैं IQueryable<dynamic>
बजाय dynamic
वापसी की कोशिश की है और मैं मूल क्वेरी कर सकता है model.FirstOrDefault();
लेकिन सब से ऊपर मैं करने में सक्षम होना चाहते हैं एक मैदान पर भी फिल्टर करें:
var record = model.FirstOrDefault(item => item.MyProperty == true);
होगा कैसे परिवर्तन के बारे में IEnumerable को गतिशील? –
Kelmen
मैंने कुछ ऐसा करने की कोशिश की (IQueryable में बदला गया) और भले ही मैं 'मॉडल.फर्स्टऑर्डफॉल्ट()' जैसे कुछ प्रश्न पूछ सकूं, यह मुझे 'मॉडल' जैसी चीज़ों को करने की अनुमति नहीं देगा। फर्स्टऑर्डडिफॉल्ट (item => item.MyProperty = = सत्य) '। जो चीज की उपयोगिता को कम कर देता है। –
DarkUrse
मैंने इस समस्या में भाग लिया है। कोई प्रस्ताव है कि आप एक संकल्प तक पहुंच गए हैं? – JosephGarrone