如何检查项目匹配谓词
本文关键字:项目 谓词 检查 何检查 | 更新日期: 2023-09-27 18:34:17
有一个通用存储库,工作正常。存储库有 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适用于非老年列表。但也许我不需要列表来检查项目是否与谓词匹配。提前感谢任何帮助!
首先,您必须编译表达式以使用它进行检查。最好存储已编译的函数,而不是在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);
}