Добавление внутреннего соединения к 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? Или я что-то упускаю?

Ответы на вопрос(1)

Ваш ответ на вопрос