Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.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# Linq谓词,用于匹配嵌套集合的许多层中的对象_C#_Linq - Fatal编程技术网

C# Linq谓词,用于匹配嵌套集合的许多层中的对象

C# Linq谓词,用于匹配嵌套集合的许多层中的对象,c#,linq,C#,Linq,我有: 编辑: 通用谓词生成器: var predicate = PredicateBuilder.True<TotalPeriod>(); ...// other logic var paymentCodes = new HashSet<string>(); ... // other logic to successfully get list of paymentCodes from UI if(paymentCodes.Any()) { predicate

我有:

编辑:

通用谓词生成器:

var predicate = PredicateBuilder.True<TotalPeriod>();
...// other logic
var paymentCodes = new HashSet<string>();
... // other logic to successfully get list of paymentCodes from UI
if(paymentCodes.Any())
{
    predicate = predicate.And(entity => entity.SubPeriods.Any(e => e.SmallerSubPeriods.Any(e => paymentCodes.Contains(e.Payment.PaymentCode))));
}
公共静态类谓词生成器
{
公共静态表达式True(){return f=>True;}
公共静态表达式和(此表达式expr1,表达式expr2)
{
var invokedExpr=Expression.Invoke(expr2,expr1.Parameters);
返回Expression.Lambda(Expression.AndAlso(expr1.Body,invokedExpr),expr1.Parameters);
}
}
谓词的应用方式:

public static class PredicateBuilder
{
    public static Expression<Func<T, bool>> True<T>() { return f => true; }
    public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
    {
        var invokedExpr = Expression.Invoke(expr2, expr1.Parameters);
        return Expression.Lambda<Func<T, bool>> (Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
    }
}
public异步任务GetManyAsync(表达式谓词,ICollection includes=null),其中T:class
{
试一试{
var expression=expression.Convert(predicate.Body,typeof(bool));
var lambda=Expression.lambda(表达式、谓词、参数);
使用var dbContext=GetDatabaseContext();
var entities=await dbContext.Set().Where(lambda.AsNoTracking().ToArrayAsync();
…//其他逻辑
}捕获(例外e){
返回DataProviderException.CatchException(e);
}
}

和()。什么类型是
谓词
以及
谓词和(…)
做什么?@Corey我添加了EDIT来添加通用谓词生成器,方法
和()。这就剩下谓词本身了。您可以显示它是如何组成的,但不能显示它是如何应用的。在某个地方,您必须调用
Where(…)
来筛选集合。你能展示一下代码吗?你是想知道是否有任何一行包含这些paymentcodes,还是想拥有这些对象?如果是这样,您需要一个
Where
子句。然后在谓词中返回一个
bool
,这并没有多大用处sense@Link我想在
PaymentCode
满足条件的地方筛选对象
PaymentCode
public static class PredicateBuilder
{
    public static Expression<Func<T, bool>> True<T>() { return f => true; }
    public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)
    {
        var invokedExpr = Expression.Invoke(expr2, expr1.Parameters);
        return Expression.Lambda<Func<T, bool>> (Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
    }
}
public async Task<ApiResponse<T>> GetManyAsync<T>(Expression<Func<TDAL, bool>> predicate, ICollection<string> includes = null) where T : class
{
    try {
            var expression = Expression.Convert(predicate.Body, typeof(bool));
            var lambda = Expression.Lambda<Func<TDAL, bool>>(expression, predicate.Parameters);
            using var dbContext = GetDatabaseContext();
            var entities = await dbContext.Set<TDAL>().Where(lambda).AsNoTracking().ToArrayAsync();
            ... // other logic
    } catch (Exception e) {
        return DataProviderException.CatchException<T>(e);
    }
}