我正在尝试创建一个 DbSet LINQ 过滤器。我使用表达式是为了减少由过滤器选项和过滤器属性的独特组合引起的代码行数。
我能够轻松地将其应用于 DbSest 中的对象属性(粘贴在下面的工作代码)。但是当我试图表达时,我遇到了障碍。我在构建表达式树时dbSet.Where(x => x.listProp.Any(y => y.Name == "val"));
不知道如何表达。.Any(...)
目前我正在尝试遵循帖子中的解决方案,但是当我到达时遇到以下问题var anyCall = ...
:System.InvalidOperationException: 'No generic method 'Any' on type 'System.Linq.Queryable' is compatible with the supplied type arguments and arguments. No type arguments should be provided if the method is non-generic. '
这是我目前拥有的。
private IQueryable<dbo.Transaction> _FilterTransactionPartyType(ParameterExpression param, IQueryable<Transaction> query, string transactionPartyType)
{
MemberExpression expM2M = Expression.PropertyOrField(param, "Parties");
Type tM2M = typeof(M2M_Transactions_Party);
ParameterExpression paramM2m = Expression.Parameter(tM2M, "m2m");
//Any(m2m => m2m.Party.Name == "dd" && m2m.PartyType.Name = "dd")
System.Reflection.PropertyInfo piParty = tM2M.GetProperty("Party");
System.Reflection.PropertyInfo piPartyName = piParty.PropertyType.GetProperty("Name");
System.Reflection.PropertyInfo piPartyType = tM2M.GetProperty("TransactionPartyType");
System.Reflection.PropertyInfo piPartyTypeName = piPartyType.PropertyType.GetProperty("Name");
MemberExpression expPartyType = Expression.Property(paramM2m, piPartyType);
MemberExpression expPartyTypeName = Expression.Property(expPartyType, piPartyTypeName);
ConstantExpression expPartyTypeValue = Expression.Constant(transactionPartyType, typeof(string));
BinaryExpression isPartyTransactionType = Expression.Equal(expPartyTypeName, expPartyTypeValue);
MemberExpression expParties = Expression.Property(paramM2m, piParty);
MemberExpression expParty = Expression.Property(expParties, piPartyName);
BinaryExpression isParty = _Filter(expParty);
BinaryExpression isPartyAndType = Expression.AndAlso(isParty, isPartyTransactionType);
Expression<Func<M2M_Transactions_Party, bool>> internalLambda = Expression.Lambda<Func<M2M_Transactions_Party, bool>>(isPartyAndType, paramM2m);
// book.properties.Any(bookProperty => bookProperty.type.key == "lingerie" && bookProperty.value == "1")
var anyCall = Expression.Call(
typeof(Queryable), "Any", new[] { tM2M },
expM2M, internalLambda
);
// book => book.properties.Any(...)
var lambda = Expression.Lambda<Func<Transaction, bool>>(anyCall, param);
return query.Where(lambda);
}