0

有一个通用存储库,工作正常。存储库有 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 适用于非通用列表。但也许我不需要一个列表来检查项目是否与谓词匹配。提前感谢您的帮助!

4

1 回答 1

2

首先,您必须编译表达式以使用它进行检查。最好存储编译的函数而不是重新编译它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);
}
于 2013-10-06T10:08:32.127 回答