¿Cómo traducir el código SQL que "tiene" la condición en Linq To SQL o Linq Entities?
-
11-07-2019 - |
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
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.