Frage

Ich habe eine Situation, wo ich versuche, eine LINQ zu filtern, um eine abgeleitete Unterklasse ausgewählt werden.

ctx.BaseEntity.OfType<SubClass>() -. Das funktioniert gut

Allerdings würde Ich mag, dies zu tun, anstatt einen String-Wert. Ich habe über eine Leistung Barriere kommen, wenn ich viele haben (> 20) Sub-Klassen und eine Entity Auswahl ohne nur mit OfType ist keine Option. Ich habe eine generische Benutzeroberfläche, die von der Basisklasse macht, so dass ich weiß nicht, was Klasse Typ wird bei der Kompilierung zurückgegeben werden.

Also, was ich tun möchte, ist dies:

  1. Führen Sie eine Auswahl projiziert, wo ich Rückkehr nur die SubClassType aus die Datenbank
  2. Führen Sie eine zweite Auswahl mit diesem Wert als OfType zu Wählen Sie nur die relevanten Zusammenhang Unternehmen aus der Datenbank (No Masse Gewerkschaften generiert)

        int id = 1;
        var classType = (from c in ctx.BaseClass.Include("ClassType")
                                   where c.id == id
                                   select new
                                              {
                                                  c.ClassType.TypeName
                                              }).First();
    
        BaseClass caseQuery = ctx.BaseClass.OfType<classType.TypeName>()
                        .Include("ClassType")
                        .Include("ChildEntity1")
                        .Include("ChildEntity2")
                        .Where(x => x.id== id);
    

Aber offensichtlich das wird nicht funktionieren, weil OfType einen Typ erfordert und kein String.

Alle Ideen, wie ich das erreichen kann?

Update: Als Randnotiz auf die ursprüngliche Frage, stellt sich heraus, dass der Moment Sie eine Abfrage Projekt, das eine Navigationseigenschaft verwendet - es das Monster SQL zu Builds, also habe ich eine gespeicherte Prozedur am Ende mit meiner Classtype Entität von den Baseclass bevöl Id.

War es hilfreich?

Lösung

Also ich habe es nur Arbeit mit eSQL, die ich noch nie zuvor benutzt hatte. Ich habe den Code hier gepostet nur falls es jemand hilft. Hat jemand eine stark typisierte Lösung bekam sie denken können?

BaseClass caseQuery = ctx.BaseClass.CreateQuery<BaseClass>("SELECT VALUE c FROM OFTYPE(Entities.[BaseClass],namespace.[" + classType.TypeName + "])  as c")
                .Include("ClassType")
                .Include("ChildEntity1")
                .Include("ChildEntity2")
                .Where(x => x.id== id).FirstOrDefault();

Andere Tipps

Um die Überschrift Frage zu beantworten OfType mit einem String / Laufzeittyp zu rufen, können Sie Folgendes tun:

// Get the type, assuming the derived type is defined in the same assembly 
// as the base class and you have the type name as a string
var typeToFilter = typeof(BaseClass)
     .Assembly
     .GetType("Namespace." + derivedTypeName);

// The use reflection to get the OfType method and call it directly
MethodInfo ofType = typeof(Queryable).GetMethod("OfType");
MethodInfo ofTypeGeneric = method.MakeGenericMethod(new Type[] { typeToFilter });
var result = (IQueryable<Equipment>)generic.Invoke(null, new object[] { equipment });

In Kombination mit der gespeicherten Prozedur den Klassennamen zu erhalten und Sie (sollte?) Vermeiden die massive kommen -. Ich habe keine Tabelle pro Typ Umsetzung mit zu spielen, so kann ich nicht Test

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top