Tengo problemas con algunas clases generadas por dbml que no se resuelven hasta SQL eficiente. Imagine que tengo una tabla de Cuentas y una tabla de Transacciones donde cada transacción está asociada a una cuenta en particular. Cargué todo esto en dbml y aparece una clase de cuenta y una clase de transacción. La clase Cuenta tiene una referencia de EntitySet a una colección de Transacciones que representa todas las transacciones en esa cuenta. Lo suficientemente justo.Abstracción de fugas en LINQ to SQL EntitySet
Ahora supongamos que solo quiero las transacciones para el período contable actual. Así agrego un método como este:
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;
}
}
se ve bien y funciona, pero el SQL no es buena:
SELECT [t0].[id], [t0].[account_id], [t0].[date], [t0].[description], [t0].[amount], [t0].[sign]
FROM [dbo].[transactions] AS [t0]
WHERE [t0].[account_id] = @p0
Es decir: se está tirando de todo el conjunto de transacciones hacia abajo y procesarla con LINQ para Objetos. Intenté eliminar la cláusula where, la cláusula orderby, reemplazando las fechas con constantes, todo sigue siendo del lado del cliente.
Para la comparación, he intentado llamar la colección transacciones directamente en el contexto de datos:
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;
y funciona muy bien:
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]
Así que después de todo eso, tengo dos preguntas:
- ¿Es correcto el comportamiento anterior de Transactions EntitySet y/o existe alguna forma de solucionarlo?
- ¿Cómo implemento el "arreglo" anterior como método en mi clase de Cuenta? Las clases de entidad generadas por dbml no tienen acceso a un DataContext.
Las propiedades de colección de Entity Framework, al menos desde 2009 hasta ahora, no son del tipo 'ObjectQuery' pero del tipo 'EntityCollection ' (que, sin embargo, tiene un método para transformarlas en 'ObjectQuery '). –