EF - obsługa tabel zależnych.

0

hej, witam wszystkich bardzo serdecznie,
javascript:
Dopiero jestem na etapie poznawania Entity Framework i póki co szło całkiem dobrze, ale natrafiłem na problem, na którym trochę utknąłem.

Dla uproszczenia mam tabelę:

public class Transaction
[Key]
public int IDTransaction
[ForeignKey("..")]
public int IDAccount 
...
public string Title;
public virtual Account Account;

oraz

public class Account
[Key]
public int IdAccount
...
public string AccountLabel;

Jak wystawiam całą tabelę do API, to nie mam problemu robię _ctx.Transaction(Where...).Include(a=>a.Account) i tak dalej - generuje mi się JSON normalnie z całą strukturą. Zacząłem natomiast pisać obsługę wyszukiwania oraz filtracji i zbudowałem sobie funkcję, która buduje wyrażenia lambda do zapytania na podstawie słownika {"nazwa kolumny", "wartość wyszukiwana}. W momencie, w którym wyszukuję bezpośrednio po tabeli poprzez:

 IQueryable<Transaction> query = _context.Transactions.AsQueryable();
            query = query.Include(p => p.Account);
            query = query.Where(
                Filter<Transaction>.GetWheres(
                    new ColumnFilter("Title", "faktura")));

Wszystko jest OK, natomiast jak próbuję sięgnąć do danych z tabel podrzędnych, jak np:

ColumnFilter("Account.AccountLabel", "ING EUR")));

Wówczas dostaję wyjątek, że atrybutu nie ma w modelu Transactions, po wykonaniu takiego wyrażenia:

Expression columnName = Expression.Property(pe, column.Name);

gdzie pe jest zadeklarowane jako:

ParameterExpression pe = Expression.Parameter(typeof(T), typeof(T).Name);

Debugger pokazuje, że argument przekazywany to rzeczywiście jest typu Projekt.Models.Transaction, a ja nie mam pojęcia jak mam przekazać całą strukturę - razem z pod tabelami. Będę bardzo wdzięczny za wszelkie sugestie.

pozdrawiam

Kal800

2

Tu jest wycinek kodu który stosowałem do budowania Expressionów dla zagnieżdzonych encji

public Expression<Func<TType, bool>> Create(Condition condition) {
            if (condition.Field.Contains(".")) {
                var p = Expression.Parameter(typeof(TType));
                Expression body = p;

                foreach (var subMember in condition.Field.Split('.')) {
                    body = Expression.Property(body, subMember);
                }

                ValidatePropertyIsNullable(condition, body.Type);

                return Expression.Lambda<Func<TType, bool>>(Expression.Equal(body, Expression.Constant(condition.Value, body.Type)), p)
}
. . .
}
public void ValidatePropertyIsNullable(Condition condition, Type type)
        {
            if ((condition.Operator == ConditionOperator.Null || condition.Operator == ConditionOperator.NotNull)
                && Nullable.GetUnderlyingType(type) == null && type.Name != nameof(String)) {
                throw new SearchCriteriaException($"Property {condition.Field} is not nullable");
            }
        }

U mnie klasa condition zawierała pole string np "Account.Number"
Gdzie w moim szukanym typie Account było jakiś podtypem z polem number.
Ja zagnieżdzone pola miałem w kryteriach roździelone kropką.
Może Ci to pomoże.

1 użytkowników online, w tym zalogowanych: 0, gości: 1