C# 如何检查项目匹配谓词
有一个通用存储库,工作正常。存储库有2个构造函数:C# 如何检查项目匹配谓词,c#,linq,predicate,C#,Linq,Predicate,有一个通用存储库,工作正常。存储库有2个构造函数: private IDbSet<T> mDbSet; private Expression<Func<T, bool>> mPredicate; ... public Repository() { mDbSet = mDb.Set<T>(); mPredicate = null; } public Rep
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;
}
私有IDbSet mDbSet;
私人表达预测;
...
公共存储库()
{
mDbSet=mDb.Set();
mPredicate=null;
}
公共存储库(表达式谓词)
{
mDbSet=mDb.Set();
mPredicate=谓词;
}
第二种方法是对存储库中的项目提供“标准”过滤器。该过滤器适用于输出和输入。因此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);
}
公共虚拟作废添加(参考T项)
{
如果(mPredicate!=null)
{
List chkList=new List(){item};
if(chkList.FirstOrDefault(mPredicate)==null)
{
抛出新的appexpetion(“添加不匹配的元素”);
}
}
mDbSet.Add(项目);
}
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();
}
if(mPredicate!=null&&!mPredicate(item)){throw new AppException…}
?
public virtual void Add(T item)
{
if (predicate != null && !predicate(item))
{
throw new AppExcpetion("Add non-matching element.");
}
mDbSet.Add(item);
}