Как да проверя, че елементът съответства на предиката

Имам общо хранилище, работи добре. Хранилището има 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