Pregunta

¿Podría decirme cómo traducir el siguiente código SQL a Linq To SQL o Linq To Entites?

El código SQL correcto es:

  

seleccione CollectId, url, userid, pubtime   de Recoger grupo por   url, collectid, userid, pubtime que tiene   pubtime > = (seleccione max (pubtime) de   recoger d donde d.url = collect.url)   ordenar por Collect.pubtime desc

El script de la tabla de la base de datos es:

  

si existe (seleccione * de los sysobjects   donde id = OBJECT_ID ('[Recopilar]') y   OBJECTPROPERTY (id, 'IsUserTable') = 1)   DROP TABLE [Collect]

     

CREATE TABLE [Collect] ([CollectId]   [int] IDENTIDAD (1, 1) NO NULL,   [Url] [nvarchar] (200) NULL, [UserId]   [nvarchar] (50) NULL, [PubTime]   [datetime] NULL)

     

ALTER TABLE [Collect] CON NOCHECK ADD   RESTRICCIÓN [PK_Collect] CLAVE PRIMARIA   CONJUNTO NO CLUSTRADO ([CollectId])   IDENTITY_INSERT [Collect] ON

     

INSERTAR [Recoger]   ([CollectId], [Url], [UserId], [PubTime])   VALORES (   1, 'www.sohu.com', 'Mike', '2008-10-10   0:00:00 ') INSERTAR [Recoger]   ([CollectId], [Url], [UserId], [PubTime])   VALORES (   2, 'www.echina365.com', 'Lily', '2008-10-15   0:00:00 ') INSERTAR [Recoger]   ([CollectId], [Url], [UserId], [PubTime])   VALORES (   3, 'www.php.com', 'Tom', '2008-10-20   0:00:00 ') INSERTAR [Recoger]   ([CollectId], [Url], [UserId], [PubTime])   VALORES (   4, 'www.echina365.com', 'YaoMing', '2008-10-23   0:00:00 ') INSERTAR [Recoger]   ([CollectId], [Url], [UserId], [PubTime])   VALORES (   5, 'www.echina365.com', 'Mike', '2008-10-25   0:00:00 ') INSERTAR [Recoger]   ([CollectId], [Url], [UserId], [PubTime])   VALORES (   6, 'www.sohu.com', 'Jack', '2008-10-26   0:00:00 ') INSERTAR [Recoger]   ([CollectId], [Url], [UserId], [PubTime])   VALORES (   7, 'www.echina365.com', 'Tracy', '2008-11-2   0:00:00 ') INSERTAR [Recoger]   ([CollectId], [Url], [UserId], [PubTime])   VALORES (   8, 'www.php.com', 'YaoMing', '2008-11-5   0:00:00 ')

     

SET IDENTITY_INSERT [Recopilar] OFF

¿Fue útil?

Solución

Ya que tu " teniendo " la condición no está realmente en una columna agregada, ¿no podría simplemente usar el " donde " cláusula?

select distinct CollectId, url, userid, pubtime
from Collect
where pubtime >= (select max(pubtime) from collect d where d.url = collect.url)
order by Collect.pubtime desc

Esto obtiene el mismo resultado dado el conjunto de datos que ha proporcionado. La declaración LINQ se vuelve razonablemente simple:

var rows = (from c in Collect
where c.PubTime >= (
    from d in Collect
    where d.Url == c.Url
    select d.PubTime).Max()
orderby c.PubTime descending
select c).Distinct();

Sin embargo, podría estar malinterpretando tu intención. Quizás mi versión de la consulta no hace exactamente lo que quieres. Si es así, déjame un comentario y eliminaré la respuesta para no confundir el problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top