2017-12-28 9 views
0

Ich versuche, DbSet in meiner Datenbankkontextklasse zu deklarieren. Weil ich nicht welche Klasse (Entity Framwork Class) Benutzer anruft. Deshalb möchte ich das DbSet mit dynamic deklarieren.Wie deklariere DbSet <dynamic>?

+0

Was hast du probiert? Was ist Ihr spezifischer Anwendungsfall? Ich denke, es ist besser, alles im Kontext explizit zu definieren und dann die dynamischen Dinge auf einer anderen Ebene zu tun. – kettch

Antwort

0

Ich würde versuchen, alles in Ihrem Kontext explizit definiert zu haben. Es gibt eine Menge Funktionalität, die in diese Eigenschaftsdeklaration eingebacken ist, nicht zuletzt der Entwicklungszeitvorteil von Typen.

Es gibt viele Techniken für die dynamische Abfrage, aber ich werde eine, die ich in der Vergangenheit für die dynamische Abfrage von Nachschlagetabellen verwendet habe, veröffentlichen.

public List<LookupItemDTO> LoadItems(int lookupId) 
{ 
    //nothing special here, just map the lookup id to a name 
    var lookupRepo = new LookupRepository<LookupDefinition>(uow); 
    var lookup = lookupRepo.Find(id); 

    //map the lookup's name from the table to a type. This is important DO NOT ACCEPT A TABLE NAME FROM THE USER. 
    var targetType = Type.GetType("MyApp.DomainClasses.Lookup." + lookup.Name + ",MyApp.DomainClasses"); 
    // this is an optional extra step but it allows us to instantiate an instance of our repository to ensure that business rules are enforced 
    var lookupType = typeof(LookupRepository<>).MakeGenericType(targetType); 
    dynamic LookupTable = Activator.CreateInstance(lookupType); 
    //just some pattern nonsense to wire up the unit of work 
    LookupTable.SetupUOW(uow); 

    //make sure to cast it into something you can work with ASAP 
    var data = ((IQueryable<LookupTableBase>)LookupTable.All).OrderByDescending(l => l.IsVisible).ThenBy(l => l.SortOrder); 

    var list = from li in data 
       select new LookupItemDTO 
       { 
        Id = li.Id, 
        Description = li.Description, 
        Display = li.Display, 
        SortOrder = li.SortOrder, 
        IsVisible = li.IsVisible 
       }; 

    return list.ToList(); 
} 

Der Schlüssel hier ist, dass Sie können dynamisch Tabellen abfragen, aber es ist besser, es auf einem höheren Niveau zu tun. Haben Sie auch eine Art Indirekt zwischen Ihnen und der Eingabe Ihres Benutzers. Lassen Sie sie eine Tabelle aus einer Liste auswählen und verwenden Sie die ID aus dieser Tabelle, um den Namen nachzuschlagen. Meine Lösung hier ist die Nachschlagetabelle Definitionstabelle. Alle dynamischen Abfragen beginnen dort zuerst und dann werden Werte aus dieser Definitionstabelle verwendet, um die erforderlichen Typen zu erstellen.

Verwandte Themen