Игнорирование избыточных неиспользуемых лямбда-выражений, проблема в последних 2 строках.
Во-первых, вы используете неправильный универсальный тип (MakeGenericMethod(property1.Type)
), в то время как правильный тип в основном является типомпараметр x
здесь
.Any(x => x.SubProductID == lead.SubProductID)
=>
.Any<T>((T x) => ...)
, который отображается в param3.Type
в вашем коде.
Второй, второй аргумент Any
должно быть лямбда-выражением (не просто equality
, как в коде).
В-третьих, поскольку user.UserRoleSubProducts
, скорее всего, является типом коллекции, вы должны отправлять вызов Enumerable.Any
, а не Queryable.Any
.
Метод Expression.Call
имеет перегрузку , что очень удобно для "вызова" статических обобщенных методов расширения:
public static MethodCallExpression Call(
Type type,
string methodName,
Type[] typeArguments,
params Expression[] arguments
)
Таким образом, последние две строки можно заменить на:
var anyCall = Expression.Call(
typeof(Enumerable), nameof(Enumerable.Any), new Type[] { param3.Type },
property1, Expression.Lambda(equality, param3)
);