【发布时间】:2015-02-12 00:10:06
【问题描述】:
我正在尝试使用实体框架 CommandTree 拦截器通过 DbContext 为每个查询添加过滤器。
为简单起见,我有两个表,一个名为“User”,有两列(“UserId”和“EmailAddress”),另一个名为“TenantUser”,有两列(“UserId”和“TenantId”)。
每次对 User 表进行 DbScan 时,我都想对 TenantUser 表进行内部联接并根据 TenantId 列进行过滤。
有一个名为EntityFramework.Filters 的项目可以按照这些思路进行操作,但不支持“复杂连接”,这似乎是我正在尝试做的。
在a demo from TechEd 2014 之后,我创建了一个拦截器,该拦截器使用以下方法的访问者将 DbScanExpressions 替换为 DbJoinExpression。一旦我开始工作,我计划将它包装在 DbFilterExpression 中,以将 TenantId 列与已知 ID 进行比较。
public override DbExpression Visit(DbScanExpression expression)
{
var table = expression.Target.ElementType as EntityType;
if (table != null && table.Name == "User")
{
return DbExpressionBuilder.InnerJoin(expression, DbExpressionBuilder.Scan(expression.Target), (l, r) =>
DbExpressionBuilder.Equal(DbExpressionBuilder.Variable(tenantUserIdProperty.TypeUsage, "UserId"),
DbExpressionBuilder.Variable(userIdProperty.TypeUsage, "UserId")));
}
return base.Visit(expression);
}
为了测试上面的代码,我将拦截器添加到 dbContext 并运行以下代码:
dbContext.Users.Select(u => new { u.EmailAddress }).ToList();
但是,这会导致以下错误:
类型“Transient.rowtype[(l,CodeFirstDatabaseSchema.User(Nullable=True,DefaultValue=)),(r,CodeFirstDatabaseSchema.User(Nullable=True,DefaultValue=) 没有声明名为“EmailAddress”的属性))]'。
我是否错误地构建了 DbJoinExpression?还是我错过了什么?
【问题讨论】:
标签: c# entity-framework entity-framework-6 entity-framework-6.1