Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检查项目匹配谓词_C#_Linq_Predicate - Fatal编程技术网

C# 如何检查项目匹配谓词

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

有一个通用存储库,工作正常。存储库有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;
    }
私有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);
}