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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top