2009-06-22 7 views
1

Donné le:LinqToSQL - Objet Cast IQueryable lors de l'exécution?

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

Où "T" est une entité générique passé dans la méthode,

Je voudrais faire quelque chose comme ceci:

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

Est-ce possible?

Actuellement, il me dit que je ne peux pas lancer de cette façon.

Je réalise que je pourrais forcer le paramètre "T" à être un IEntitySoftDeletable au niveau de la classe ou de la méthode, mais j'essaie d'éviter cela et de fournir plus de flexibilité à partir de la même méthode.

+0

Est-ce que T implémente IEntitySoftDeletable? – bytebender

+0

pas toujours ... T pourrait être un nombre quelconque de types, dont certains implémentent IEntitySoftDeletable. Ce que j'aimerais, c'est ajouter un prédicat à l'interrogeable * si * T est un IEntitySoftDeletable. Ce que j'essaye d'éviter exige une surcharge pour ce comportement séparé. –

Répondre

0

Je ne suis pas certain d'avoir compris ce que vous vouliez mais cela fonctionnerait-il?

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

Même problème. Il dit qu'il ne peut pas lancer "T" à "IEntitySoftDeletable". J'ai une classe qui accepte "T", où T n'a aucune contrainte. Donc, quand je reçois un queryable de type "T" ce n'est pas un IEntityQueryable, mais il pourrait "être". Ce que je veux faire est de vérifier à l'exécution si c'est le cas, et si c'est le cas, vérifiez la valeur de IsDeleted. Votre méthode me permet de vérifier IsDeleted, mais la requête ne peut pas être convertie du type "T" vers "IEntitySoftDeletable". Je pense que je suis foutu et que je dois mettre une contrainte sur une surcharge. –

+0

Oh attends, désolé, j'avais un pet de cerveau. Votre méthode va fonctionner. Je ne peux simplement pas le renvoyer dans la même variable de requête "duh". Je dois déclarer une nouvelle requête. –

0

Vous pouvez tester une interface en utilisant

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

Je pense que cela devrait fonctionner pour ce que vous avez besoin ... il suffit de rajouter un à l'aide pour System.Reflection.

+0

Je n'ai pas de problème pour déterminer si un obj est un IEntitySoftDeletable, j'ai du mal à lancer un IQueryable vers un IQueryable . La seule façon de le faire est de contraindre "T" à être un IEntitySoftDeletable au niveau de la classe ou de la méthode. –

Questions connexes