Mam problem z niektórymi klasami generowanymi przez dbml, które nie pozwalają na sprawne działanie SQL. Wyobraź sobie, że mam tabelę kont i tabelę transakcji, w której każda transakcja jest powiązana z określonym kontem. Załadowałem wszystko do dbml i out wyskakuje klasy konta i klasy transakcji. Klasa Account ma odwołanie do EntitySet do kolekcji Transakcji, która reprezentuje wszystkie transakcje na tym koncie. Słusznie.Przeciekająca abstrakcja w LINQ do SQL EntitySet
Załóżmy teraz, że chcę tylko transakcji dla bieżącego okresu rozliczeniowego. Więc dodać metodę tak:
public IEnumerable<Transaction> CurrentTransactions
{
get
{
DateTime dtStart = CurrentPeriod;
DateTime dtEnd = NextPeriod;
return
from t in Transactions
orderby t.date
where t.date >= CurrentPeriod && t.date <= NextPeriod
select t;
}
}
Wygląda ładnie i działa, ale SQL nie jest dobre:
SELECT [t0].[id], [t0].[account_id], [t0].[date], [t0].[description], [t0].[amount], [t0].[sign]
FROM [dbo].[transactions] AS [t0]
WHERE [t0].[account_id] = @p0
Ie: to ciągnąc cały zbiór transakcji w dół i przetwarzania go z LINQ dla obiektów. Próbowałem, aby usunąć klauzulę where, klauzulę orderby, zastępującą daty stałymi, ale wciąż wszystko działa po stronie klienta.
Dla porównania, próbowałem wywołanie kolekcję Transakcje bezpośrednio z kontekstu danych:
DateTime dtStart = account.CurrentPeriod;
DateTime dtEnd = account.NextPeriod;
IEnumerable<Transaction> trans=
from t in MyDataContext.Transactions
orderby t.date
where t.date >= dtStart && t.date <= dtEnd && t.account_id==iAccountID
select t;
i działa pięknie:
SELECT [t0].[id], [t0].[account_id], [t0].[date], [t0].[description], [t0].[amount], [t0].[sign]
FROM [dbo].[transactions] AS [t0]
WHERE ([t0].[date] >= @p0) AND ([t0].[date] <= @p1) AND ([t0].[account_id] = @p2)
ORDER BY [t0].[date]
Więc po tym wszystkim, mam dwa pytania:
- Czy powyższe zachowanie zestawu EntactionsSet jest prawidłowe i/lub czy istnieje sposób jego rozwiązania?
- Jak zaimplementować powyższą "naprawę" jako metodę na mojej klasie konta. Klasa encji wygenerowana przez dbml nie ma dostępu do DataContext.
Właściwości kolekcji Entity Framework, przynajmniej od 2009 do teraz, nie są typu 'ObjectQuery' ale typu 'EntityCollection ' (który jednak ma metodę przekształcania ich w 'ObjectQuery '). –