2009-06-22 20 views
1

diese Gegeben:LinqToSQL - Cast IQueryable Objekt zur Laufzeit?

var query = context.GetTable<T>(); 

Wo "T" ist eine generische Einheit in die Methode übergeben,

Ich mag würde, so etwas tun:

if(typeof(TEntity) is IEntitySoftDeletable) 
    query = query.Cast<IEntitySoftDeletable>.Where(ent => !ent.IsDeleted); 
} 

Ist das möglich?

Momentan sagt es mir, dass ich nicht auf diese Weise sprechen kann.

Ich realisiere, dass ich Parameter "T" zu einem IEntitySoftDeletable auf der Klassen- oder Methodenebene zwingen könnte, aber ich versuche das zu vermeiden und biete mehr Flexibilität von der gleichen Methode.

+0

Implementiert T IEntitySoftDeletable? – bytebender

+0

nicht immer ... T könnte eine beliebige Anzahl von Typen sein, von denen einige IEntitySoftDeletable implementieren. Was ich möchte ist ein Prädikat an die Abfrage anfügen, wenn * T ein IEntitySoftDeletable ist. Was ich vermeiden will, ist eine Überladung für dieses seperate Verhalten. –

Antwort

0

Nicht sicher, ich verstehe vollständig, was Sie wollen, aber würde das funktionieren?

query.OfType<IEntitySoftDeletable>().Where(ent => !ent.IsDeleted); //OfType will only give the ones that are IEntitySoftDelteable 
+0

Gleiches Problem. Es besagt, dass es nicht "T" zu "IEntitySoftDeletable" kann. Ich habe eine Klasse, die "T" akzeptiert, wobei T keine Einschränkungen hat. Also wenn ich eine Abfrage von Typ "T" bekomme, ist es kein IEntityQueryable, aber es "könnte" sein. Ich möchte zur Laufzeit überprüfen, ob dies der Fall ist, und wenn ja, überprüfe den Wert von IsDeleted. Ihre Methode ermöglicht es mir, IsDeleted zu überprüfen, aber die Abfrage kann nicht vom Typ "T" in "IEntitySoftDeletable" umgewandelt werden. Ich denke, ich bin geschraubt und muss im Grunde eine Beschränkung auf eine Überlastung setzen. –

+0

Oh, warte, tut mir leid, ich hatte einen Hirnfurz. Ihre Methode wird funktionieren. Ich kann es nur nicht in die gleiche Abfragevariable "duh" zurückgeben. Ich muss eine neue Abfrage deklarieren. –

0

Sie können für eine Schnittstelle testen

obj.GetType().GetInterface("IEntitySoftDelete") == null 

denke ich mit, dass für die Arbeit sollte, was Sie brauchen ... nur sicherstellen, dass eine Verwendung für System.Reflection hinzuzufügen.

+0

Ich habe keine Probleme zu bestimmen, ob ein Obj ein IEntitySoftDeletable ist, ich habe Probleme beim Umwandeln eines IQueryable in ein IQueryable . Die einzige Möglichkeit, die ich tun kann, ist, "T" zu einem IEntitySoftDeletable auf der Klassen- oder Methodenebene zu beschränken. –