Как проверить соответствие элемента предикату

Есть общий репозиторий, работает нормально. Репозиторий получил 2 конструктора:

    private IDbSet<T> mDbSet;
    private Expression<Func<T, bool>> mPredicate;
    ...  

    public Repository()
    {
        mDbSet = mDb.Set<T>();
        mPredicate = null;
    }

    public Repository(Expression<Func<T, bool>> predicate)
    {
        mDbSet = mDb.Set<T>();
        mPredicate = predicate;
    }

Второй для предоставления «стандартного» фильтра для элементов в репозитории. Фильтр применяется как к выходу, так и к входу. Таким образом, функция Add нуждается в проверке, соответствует ли элемент предикату. Как это сделать. Не компилируется следующее:

public virtual void Add(ref T item)
{
    if (mPredicate != null)
    {
        List<T> chkList = new List<T>() { item };

        if (chkList.FirstOrDefault(mPredicate) == null)
        {
            throw new AppExcpetion("Add non-matching element.");
        }
    }

    mDbSet.Add(item);
}

FirstOrDefault отлично работает для нестандартных списков. Но, возможно, мне не нужен список, чтобы проверить соответствие элемента предикату. Заранее благодарю за любую помощь!


person Gerard    schedule 06.10.2013    source источник


Ответы (1)


Прежде всего, вы должны скомпилировать выражение, чтобы использовать его для проверки. Вероятно, было бы лучше сохранить скомпилированную функцию, а не перекомпилировать ее на Add:

private readonly Expression<Func<T, bool>> mPredicate;
private readonly Func<T, bool> predicate;

public Repository(Expression<Func<T, bool>> predicate)
{
    mDbSet = mDb.Set<T>();
    mPredicate = predicate;
    this.predicate = mPredicate.Compile();
}

Также ref не требуется (или не требуется) для параметра:

public virtual void Add(T item)
{
    if (predicate != null && !predicate(item))
    {        
        throw new AppExcpetion("Add non-matching element.");
    }
    mDbSet.Add(item);
}
person Patryk Ćwiek    schedule 06.10.2013