Filtrez des suppressions soft de dbContext set ()
-
29-10-2019 - |
Question
Comment puis-je filtrer le IsSoftDeleted
Articles hors de ce DBSET?
var type = GetTypeFromString("Whatever");
var whatevers = Set(type);
Méthode
public dynamic Set(Type type)
{
var set = dbContext.Set(type);
return set;
}
Modèle
public class Whatever : BaseEntity
{
public virtual string Name { get; set; }
}
public class BaseEntity
{
public virtual int Id { get; set; }
public virtual bool? IsSoftDeleted { get; set; }
}
Edit: oublié de montrer Whatever
dérive de BaseEntity
La solution
Votre classe n'a pas de propriété IssoftSoftdeleted, il n'y a donc rien à filtrer. Je vais supposer tout ce qui est dérivé de la base de la base.
Le principal problème est que iQueryableu003CT> .Oin où n'existe pas réellement: c'est une méthode d'extension et les méthodes d'extension ne jouent pas bien avec les types dynamiques. Si le compilateur peut voir un type implémente iQueryableu003CT> , vous pouvez taper var.where (...) et demander au compilateur de le résoudre sur System.Linq.Queryable.Where (var, ...). Étant donné que le type est dynamique dans votre exemple, le compilateur ne sait pas qu'il implémente iQueryable et rapportera une erreur lorsque vous essayez d'appeler où.
Vous pouvez lancer le DBSet à iQueryableu003CBaseEntity> (tant que le type a la base de la base en tant que classe de base) et appelez n'importe quel filtre à ce sujet. Utilisez-vous réellement la fonction de type dynamique? Sinon, vous pouvez également envisager de supprimer votre fonction de définition personnalisée et d'utiliser la fonction DBContext.set par défaut.
var query = (from e in (IQueryable<BaseEntity>)dbContext.Set(type)
where e.IsSoftDeleted != true
select e);
Remarque: c'est ne pas la même chose que l'utilisation de dbContext.set (type) .castu003CBaseEntity> (): Cela ne fonctionnera pas, car un DBSetu003CBaseEntity> Et un DBSetu003CWhatever> sont incompatibles. Ce n'est qu'avec IQueryable et d'autres interfaces avec des arguments de type "Out" que vous pouvez le faire.
Autres conseils
Le problème est que Set(Type type)
Renvoie un non générique DbSet
. Pour appliquer votre filtre, vous devez le lancer à un générique IQueryable<T>
:
var set = ((IQueryable<BaseEntity>)dbContext.Set(type))
.Where(be => be.IsSoftDeleted.HasValue && !be.IsSoftDeleted.Value);
Cela ne fonctionne que si type
dérive de BaseEntity
ou BaseEntity
lui-même, sinon vous obtiendrez une exception d'exécution.
La résultante set
est de type IQueryable<BaseEntity>
, donc la question est de savoir à quel point ce résultat est utile et comment vous pouvez appliquer d'autres filtres pour vos entités dérivées comme Where(w => w.Name == "abc")
. Au moins, je n'ai pas pu obtenir de code compilable en faisant set
de type dynamic
. Je ne voudrais pas non plus perdre tout typage fort.