簡體   English   中英

C#表達式樹編譯問題

[英]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")))

但是當我調用 lambdaExp1.Compile() 時,它給了我以下錯誤在此處輸入圖片說明

如果你更換你的

var paramExp = Expression.Parameter(typeof(MongoIdentityUser), "t");

var paramExp= filterToUse.Parameters[0];

那么它應該工作。

您不能將 Expression filterToUse的參數引用為"t" (是否會嘗試捕獲名為t的局部范圍變量?)

filterToUseparamExp中的t參數被LambdaCompiler視為不同的ParameterExpressionParameterExpression不會覆蓋EqualsGetHashcode並用作Definitions字典中的鍵)。

如果您將 Entity Framework Core 添加到您的項目中,您可以使用ReplacingExpressionVisitort ReplacingExpressionVisitorparamExp

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM