我试图获得以下代码:
db.Invoices.Where(x => Dimensions.All(y => x.DimensionSet.Entries.Any(dim => (d.DimensionValue.DimensionCode + "_" + d.DimensionValue.Value) == y))
我尝试过的事情:
/* Dimensions Logic
* Copy the following logic:
* {&& Dimensions.All(y => x.DimensionSet.Entries.Any(d => (d.DimensionValue.DimensionCode + "_" + d.DimensionValue.Value) == y))}
*/
/* Get expression of the nested property Func<string, bool> to imitate the second argument of `Dimensions.All` */
Expression entriesExpression = Expression.Property(body, "Entries");
/* Get expression of the current Dimensions property */
Expression dimensionsExpression = Expression.Constant(Dimensions);
Type dimensionsAllType = typeof(Func<,>).MakeGenericType(typeof(string), typeof(bool));
Type innerAnyType = typeof(Func<,>).MakeGenericType(typeof(DimensionSetEntry), typeof(bool));
/* Get the `All` method that may be used in LINQ2SQL
* Making a generic method will guarantee that the given method
* will match with the needed parameters.
* Like it was a "real" linq call.
*/
MethodInfo methodAll =
typeof(Enumerable)
.GetMethods()
.FirstOrDefault(x => x.Name == "All")
.MakeGenericMethod(dimensionsAllType);
MethodInfo methodAny =
typeof(Enumerable)
.GetMethods()
.FirstOrDefault(x => x.Name == "Any")
.MakeGenericMethod(innerAnyType);
MethodCallExpression call_Any = Expression.Call(
null,
methodAny,
entriesExpression,
Expression.Lambda(Expression.Constant(true), Expression.Parameter(typeof(DimensionSetEntry), "y"))
);
MethodCallExpression call_All = Expression.Call(
null,
methodAll,
dimensionsExpression,
call_Any
);
现在,我只是在与表达式调用争吵。
MethodCallExpression call_Any = Expression.Call(
null,
methodAny,
entriesExpression,
Expression.Lambda(Expression.Constant(true), Expression.Parameter(typeof(DimensionSetEntry), "y"))
);
我试图调用Any
的{{1}}方法。
表达式Enumerable
代表entriesExpression
(类型:x.DimensionSet.Entries
)
并且下一个参数代表一个常量ICollection<DimensionSetEntry>
,其目的仅在于测试此时的调用,但此处我需要插入x => True
。
但是,调用此方法时,会发生以下错误:
为方法调用提供的参数数量不正确&#39;布尔值 任何[FUNC
(d.DimensionValue.DimensionCode + "_" + d.DimensionValue.Value) == y
1 [System.Func`2 [EmployeePortal.Models.DimensionSetEntry,System.Boolean]])&#39;
答案 0 :(得分:4)
Any()
有两个重载;一个只需要IEnumerable<T>
而另一个也需要一个lambda。
您的methodAny
变量可能包含第一个变量。您需要更改该变量以使用两个参数查找重载。