为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
撒科打诨 2022-06-18 17:38:54
我想将 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()”并将在本地进行评估。
查看完整描述

1 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

问题出Func在这里


private Func<int> tenantId => ...

这导致翻译Invoke(__ef_filter__tenantId_0))和客户评价不佳。


解决方案是制作tenantId简单的int返回属性或方法。例如,保持通话


b.AddTenancy(() => this.tenantId(), "TenantId");

它应该改为


private int tenantId()

{

    // return tenant id

    if (this.tenantContext != null && this.tenantContext.Tenant != null)

    {

        return this.tenantContext.Tenant.Id;

    }


    return -1;

};


查看完整回答
反对 回复 2022-06-18
  • 1 回答
  • 0 关注
  • 97 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信