J'ai des problèmes avec certaines classes générées par dbml qui ne résolvent pas SQL efficacement. Imaginez que j'ai une table des comptes et une table des transactions où chaque transaction est associée à un compte particulier. Je charge tout cela dans dbml et sort une classe Account et une classe Transaction. La classe Account a une référence EntitySet à une collection de transactions qui représente toutes les transactions de ce compte. C'est suffisant.L'abstraction fuyante dans LINQ to SQL EntitySet
Supposons maintenant que je ne souhaite que les transactions pour la période comptable en cours. J'ajoute donc une méthode comme ceci:
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;
}
}
est joli et il fonctionne, mais le SQL est pas bon:
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: il est tirer l'ensemble des transactions vers le bas et le traitement avec LINQ pour les objets. J'ai essayé de sortir la clause where, la clause orderby, en remplaçant les dates par des constantes tout est encore fait côté client.
À titre de comparaison, j'ai essayé d'appeler la collecte des transactions directement sur le contexte de données:
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;
et il fonctionne à merveille:
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]
Alors, après tout cela, j'ai deux questions:
- Le comportement ci-dessus de Transactions EntitySet est-il correct et/ou existe-t-il un moyen de le réparer?
- Comment implémenter le "fix" ci-dessus comme méthode sur ma classe de compte. Les classes d'entités générées par dbml n'ont pas accès à un DataContext.
Les propriétés de collection d'Entity Framework, au moins de 2009 jusqu'à maintenant, ne sont pas de type 'ObjectQuery' mais de type 'EntityCollection ' (qui a cependant une méthode pour les transformer en 'ObjectQuery '). –