[英]C# Expression Tree compile issue
我有以下表達式樹,它在編譯表達式樹時出現錯誤。
string tenantId = "tst user";
Expression<Func<MongoIdentityUser, bool>> filterToUse = t => t.IsActive == true && t.IsApproved == true;
var expConst = Expression.Constant(tenantId);
var paramExp = Expression.Parameter(typeof(MongoIdentityUser), "t");
var callExp = Expression.PropertyOrField(paramExp, "TenantId");
var equalExp = Expression.Equal(callExp,Expression.Constant(null));
var equalExp2 = Expression.Equal(callExp, expConst);
var conditionExp = Expression.Condition(equalExp, Expression.Constant(true), equalExp2);
var AndExp = Expression.AndAlso(filterToUse.Body, conditionExp);
var lambdaExp1 = Expression.Lambda<Func<MongoIdentityUser, bool>>(AndExp, paramExp);
Console.WriteLine(lambdaExp1.Compile());
The generated expression is as follows
t => (((t.IsActive == True) AndAlso (t.IsApproved == True)) AndAlso IIF((t.TenantId == null), True, (t.TenantId == "tst user")))
如果你更換你的
var paramExp = Expression.Parameter(typeof(MongoIdentityUser), "t");
和
var paramExp= filterToUse.Parameters[0];
那么它應該工作。
您不能將 Expression filterToUse
的參數引用為"t"
(是否會嘗試捕獲名為t
的局部范圍變量?)
filterToUse
和paramExp
中的t
參數被LambdaCompiler
視為不同的ParameterExpression
( ParameterExpression
不會覆蓋Equals
和GetHashcode
並用作Definitions
字典中的鍵)。
如果您將 Entity Framework Core 添加到您的項目中,您可以使用ReplacingExpressionVisitor
將t
ReplacingExpressionVisitor
為paramExp
:
var filter = ReplacingExpressionVisitor.Replace(filterToUse.Parameters.First(), paramExp, filterToUse.Body);
var AndExp = Expression.AndAlso(filter, conditionExp);
....
如果它不適合你,你可以自己寫一個。 或者使用filterToUse.Parameters.First()
(因為你只有一個表達式來擴展/組合)作為你的paramExp
,即:
var paramExp = filterToUse.Parameters.First();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.