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);
}
}