Добавление внутреннего соединения к DbScanExpression в Entity Framework Interceptor
Я пытаюсь использовать перехватчик Entity Framework CommandTree, чтобы добавить фильтр к каждому запросу через DbContext.
Для простоты у меня есть две таблицы, одна называется «Пользователь» с двумя столбцами («UserId» и «EmailAddress»), а другая называется «TenantUser» с двумя столбцами («UserId» и «TenantId»).
Каждый раз, когда есть DbScan таблицы User, я хочу выполнить внутреннее соединение с таблицей TenantUser и фильтровать ее по столбцу TenantId.
Есть проект под названиемEntityFramework.Filters он делает что-то в этом направлении, но не поддерживает «сложные соединения», что, похоже, я и пытаюсь сделать.
Следующийдемо от TechEd 2014Я создал перехватчик, который использует посетителя с помощью метода ниже, чтобы заменить DbScanExpressions на DbJoinExpression. Как только я получу это, я планирую обернуть его в DbFilterExpression, чтобы сравнить столбец TenantId с известным идентификатором.
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();
Однако это приводит к следующей ошибке:
Никакое свойство с именем 'EmailAddress' не объявляется типом 'Transient.rowtype [(l, CodeFirstDatabaseSchema.User (Nullable = True, DefaultValue =)), (r, CodeFirstDatabaseSchema.User (Nullable = True, DefaultValue =))] ».
Я неправильно строю DbJoinExpression? Или я что-то упускаю?