Próbuję użyć przechwytywacza Entity Framework CommandTree, aby dodać filtr do każdego zapytania za pomocą DbContext.Dodawanie wewnętrznego sprzężenia do DbScanExpression w Entity Framework Interceptor
Dla uproszczenia, mam dwie tabele, jedną o nazwie "Użytkownik" z dwiema kolumnami ("UserId" i "EmailAddress") i drugą nazwaną "TenantUser" z dwiema kolumnami ("UserId" i "TenantId") .
Za każdym razem, gdy istnieje tabela DbScan użytkownika, chcę wykonać sprzężenie wewnętrzne względem tabeli TenantUser i filtrować na podstawie kolumny TenantId.
Istnieje projekt o nazwie EntityFramework.Filters, który robi coś podobnego, ale nie obsługuje "złożonych połączeń", co wydaje się być tym, co próbuję zrobić.
Po a demo from TechEd 2014, stworzyłem przechwytywacz, który używa gościa z poniższą metodą, aby zastąpić wyrażenie DbScanExpressions wyrażeniem DbJoin. Kiedy już to zrobię, zamierzam owijać go w DbFilterExpression, aby porównać kolumnę TenantId ze znanym 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);
}
Aby przetestować powyższy kod, dodałem do przechwytywania dbContext i uruchom następujący kod:
dbContext.Users.Select(u => new { u.EmailAddress }).ToList();
Powoduje to jednak w następujący błąd:
No property with the name 'EmailAddress' is declared by the type 'Transient.rowtype[(l,CodeFirstDatabaseSchema.User(Nullable=True,DefaultValue=)),(r,CodeFirstDatabaseSchema.User(Nullable=True,DefaultValue=))]'.
Czy niepoprawnie buduję wyrażenie DbJoin? Czy może brakuje mi czegoś innego?
To jest dokładnie to, czego potrzebowałem. Dziękuję bardzo! –
Moja odpowiedź nadeszła prawdopodobnie "trochę" za późno, przepraszam za to :) Ale może w przyszłości ktoś będzie z niej korzystał. – mr100
Czy jest jakiś sposób przekazania zwykłego Wyrażania w Gość, aby ułatwić pisanie tych skanów? – AndrewP