2010-11-22 37 views
6

Estoy buscando ayuda para convertir la siguiente consulta sql a LINQ a entidades en C#.Convertir consulta SQL (con subconsulta correlacionada) a LINQ en C#

SELECT f.FundId, u.UnitValue 
FROM Fund f 
INNER JOIN FundUnit u ON f.FundId= u.FundId 
WHERE u.EffectiveDate = (SELECT MAX(effectivedate) 
         FROM FundUnit k 
         WHERE u.FundId = k.FundId) 
AND f.Active = 1 
ORDER BY f.FundId 

La consulta lee todos los fondos activos en la base de datos junto con su último valor unitario. La tabla del Fondo que contiene un registro para cada fondo. La tabla FundUnit contiene un registro de valor unitario para cada fondo por fecha. Los valores unitarios de fechas anteriores también se dejan en la tabla para mantener un historial.

No todos los fondos reciben un nuevo valor unitario cada día, por lo tanto, la fecha de vigencia más reciente para todos los fondos no es necesariamente la misma. Por lo tanto, la función max (effectivedate) debe aplicarse a la tabla de unidades que se debe aplicar por fondo, de ahí la subconsulta correlacionada.

Gracias

Respuesta

6

Con el fin de responder a la pregunta, voy a tener que asumir el nombre de sus entidades.

SELECT f.FundId, u.UnitValue del fondo de f INNER JOIN FundUnit U en f.FundId = u.FundId DONDE u.EffectiveDate = (SELECT MAX (EFFECTIVEDATE) DE FundUnit k donde U .FundId = k.FundId) y f.Active = 1 ORDER BY f.FundId

voy a suponer una entidad Fondo y una entidad FundUnit, al igual que el ejemplo.

var query = from f in Fund 
      from u in FundUnit 
      where f.FundId == u.FundId 
      && u.EffectiveDate == (from k in FundUnit 
            where u.FundId = k.FundId 
            select EffectiveDate).Max() 
      && f.Active == 1 
      select new { Id = f.FundId, EffectiveDate = u.EffectiveDate } // Add any fields you need 
      order by f.FundId 

Hice todo esto desde la memoria y no lo probé, puede haber algunos problemas menores. Si tengo tiempo, lo probaré.

0

creo que esto debería ayudar: directly execute sql strings

+0

lo siento, veo que es linq para las entidades. se aplica el mismo principio: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx – Kell

Cuestiones relacionadas