我有EF代碼優先解決方案,它支持軟刪除,因此我們將實體標記爲IsDeleted,而不是從數據庫中刪除它們。 我想整理相關對象的集合(延遲加載),因此標記爲已刪除的實體不會返回給API用戶。EF 4.1代碼首先過濾延遲加載的集合
下面是簡單的approache我用:
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();
}
}
我已經實現的ICollection所以內部過濾器對象。我使用這個類而不是ICollection,所以過濾的實體返回給我。 我已經做了一些測試,看起來效果很好,但我對這個解決方案感到不舒服。
請給我提供這種方法的缺點或請建議,以防萬一你知道一些更好的。
由於事前,
-Petro