簡體   English   中英

擴展表達式 <func<t, bool> &gt;

[英]Extending an expression<func<t, bool>>

自從我深入研究表達式樹以來已經有很長時間了,我一直在努力解決以下問題。

基本上,我想采用以下Expression<Func<T, TIdType>>

(a) => EF.Property<TIdType>(a, "TenantId")

並將其擴展為這個Expression<Func<T, bool>

(a) => EF.Property<TIdType>(a, "TenantId").Equals(TenantId)

所以基本上我想采用原始表達式並添加.Equals(TenantId)

對於此問題的背景,全部歸因於我試圖解決此處提出的EF Core 2.0中的問題:

https://github.com/aspnet/EntityFrameworkCore/issues/11456

希望以下內容能更詳細地說明我的嘗試:

public class FooEntity
{
    public Guid TenantId { get; set; }
}

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {

        var adaptor = new TenantFilterExpressionAdaptor<FooEntity, Guid>();
        var tenantIdFilter = adaptor.Adapt((a) => EF.Property<Guid>(a, "TenantId"));

    }
}

public class TenantFilterExpressionAdaptor<T, TIdType>
{

    public TIdType TenantId { get; set; }

    public Expression<Func<T, bool>> Adapt(Expression<Func<T, TIdType>> idExpression)
    {

        // Tack on .Equals(TenantId) to the expression!?

        // assume I have to add nodes to the body?
        // idExpression.Body?

    }

}

您必須構建新的表達式,因為表達式是不可變的。 在這種情況下,您可以為新表達式重用現有表達式的主體和參數:

public class TenantFilterExpressionAdaptor<T, TIdType> {

    public TIdType TenantId { get; set; }

    public Expression<Func<T, bool>> Adapt(Expression<Func<T, TIdType>> idExpression) {
        return Expression.Lambda<Func<T, bool>>(
            Expression.Equal(idExpression.Body, Expression.Constant(TenantId)),
            idExpression.Parameters);
    }
}

您在評論中提到常數對您有問題。 在這種情況下,您可以引用屬性本身而不是其值:

return Expression.Lambda<Func<T, bool>>(
    Expression.Equal(idExpression.Body, Expression.Property(Expression.Constant(this), nameof(TenantId))),
    idExpression.Parameters);

這將是這樣的表達式:

x => x.TenantId == this.TenantId

this是您的適配器的實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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