扩展方法中的表达式树将在本地评估

我想将 TenantId 添加到 Asp.Net 身份表(例如:用户)。


以下代码段工作正常。租户上下文将通过 DI 注入,租户根据 http 上下文域进行更改:


private readonly ITenantContext<ApplicationTenant> tenantContext;


public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, ITenantContext<ApplicationTenant> tenantContext) : base(options)

{

    this.tenantContext = tenantContext;

}


protected override void OnModelCreating(ModelBuilder builder)

{

    base.OnModelCreating(builder);


    builder.Entity<ApplicationUser>(b =>

    {

        // add tenant

        b.Property(typeof(int), "TenantId");

        b.HasQueryFilter(x => EF.Property<int>(x, "TenantId") == this.tenantContext.Tenant.Id);

    });

}

为了重用,我想为 entityBuilder 创建一个扩展方法:


public static class EntityTypeBuilderExtensions

{


    public static void AddTenancy<TEntity>(

        this EntityTypeBuilder<TEntity> builder,

        Expression<Func<int>> tenantId,

        string propertyName = "TenantId")

        where TEntity : class

    {

        // validate

        Ensure.Argument.NotNull("builder", builder);


        // add property to entity

        builder.Property(typeof(int), propertyName).IsRequired();



        /* THIS WORKS BUT WILL BE EVALUATED LOCALLY */

        // left

        var parameterExp = Expression.Parameter(typeof(TEntity), "x"); // e = TEntity => e.g: User

        var propertyNameExp = Expression.Constant(propertyName, typeof(string)); // the name of the tenant column - eg.: TenantId

    }

}


扩展方法也可以正常工作,但表达式是在本地评估的:-(。有人可以帮我修复它吗?


LINQ 表达式 'where (Property([x], "TenantId") == Invoke(__ef_filter__tenantId_0))' 无法翻译,将在本地进行评估。无法翻译 LINQ 表达式“where ([x].NormalizedUserName == __normalizedUserName_0)”并将在本地进行评估。无法翻译 LINQ 表达式“FirstOrDefault()”并将在本地进行评估。


撒科打诨
浏览 99回答 1
1回答

倚天杖

问题出Func在这里private Func<int> tenantId => ...这导致翻译Invoke(__ef_filter__tenantId_0))和客户评价不佳。解决方案是制作tenantId简单的int返回属性或方法。例如,保持通话b.AddTenancy(() => this.tenantId(), "TenantId");它应该改为private int tenantId(){&nbsp; &nbsp; // return tenant id&nbsp; &nbsp; if (this.tenantContext != null && this.tenantContext.Tenant != null)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return this.tenantContext.Tenant.Id;&nbsp; &nbsp; }&nbsp; &nbsp; return -1;};
打开App,查看更多内容
随时随地看视频慕课网APP