J'ai le code EF Première solution qui supporte la suppression logicielle, donc nous marquons les entités comme IsDeleted et ne les retirons pas de la base de données. Je voudrais regrouper les objets associés (chargement différé) afin que les entités marquées comme supprimées ne soient pas renvoyées à l'utilisateur de l'API.EF 4.1 Code Premier filtrage des collections chargées paresseuses
Voici approache simple, j'utilise:
public class FilteredCollection<T> : ICollection<T> where T : DeletableEntity
{
private List<T> _listWithDeleted = new List<T>();
protected IEnumerable<T> FilteredItems
{
get { return _listWithDeleted.Where(e => e.IsDeleted == false); }
}
protected bool _IsReadOnly;
public virtual T this[int index]
{
get
{
return FilteredItems.ToList()[index];
}
set
{
FilteredItems.ToList()[index] = value;
}
}
public virtual int Count
{
get
{
return FilteredItems.Count();
}
}
public virtual bool IsReadOnly
{
get
{
return _IsReadOnly;
}
}
public virtual void Add(T entityObject)
{
_listWithDeleted.Add(entityObject);
}
public virtual bool Remove(T entityObject)
{
if (FilteredItems.Contains(entityObject))
{
entityObject.IsDeleted = true;
return true;
}
else
{
return false;
}
}
public bool Contains(T entityObject)
{
return FilteredItems.Contains(entityObject);
}
public virtual void CopyTo(T[] entityObjectArray, int index)
{
var list = FilteredItems.ToList();
list.CopyTo(entityObjectArray, index);
}
public virtual void Clear()
{
foreach (var item in _listWithDeleted)
{
item.IsDeleted = true;
}
}
public virtual IEnumerator<T> GetEnumerator()
{
return FilteredItems.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return FilteredItems.GetEnumerator();
}
}
J'ai mis en ICollection il filtre l'objet en interne. J'utilise cette classe au lieu de ICollection pour que les entités filtrées me soient renvoyées. J'ai fait quelques tests et il semble que cela fonctionne bien, mais je ne me sens pas à l'aise avec cette solution.
Pourriez-vous s'il vous plaît me fournir des inconvénients de cette approche ou s'il vous plaît suggérer au cas où vous en connaissez un meilleur.
Merci d'avance,
-Petro