Frage

Könnten Sie mir sagen, wie der folgenden SQL-Code zu LINQ to SQL oder Linq To Entities übersetzen?

Der richtige SQL-Code ist:

  

wählen CollectId, URL, Benutzer-ID, pubtime   von Collect Gruppe von   url, collectid, Benutzer-ID, pubtime mit   pubtime> = (select max (pubtime) aus   sammeln d wo d.url = collect.url)   Um von Collect.pubtime desc

Die Datenbanktabelle Skript ist:

  

, wenn vorhanden ist (select * from sysobjects   wobei id = OBJECT_ID ( '[Collect]') und   OBJECT (id, 'IsUserTable') = 1)   DROP TABLE [sammeln]

     

CREATE TABLE [Sammeln] ([CollectId]   [Int] IDENTITY (1, 1) NOT NULL,   [URL] [nvarchar] (200) NULL, [Benutzer-ID]   [Nvarchar] (50), NULL, [PubTime]   [Datetime] NULL)

     

ALTER TABLE [Sammeln] MIT NOCHECK ADD   CONSTRAINT [PK_Collect] PRIMARY KEY   NONCLUSTERED ([CollectId]) SET   IDENTITY [sammeln] ON

     

INSERT [sammeln]   ([CollectId], [URL], [Benutzer-ID], [PubTime])   VALUES (   1, 'www.sohu.com', 'Mike', '2008-10-10   INSERT 00.00.00' ) [Sammeln]   ([CollectId], [URL], [Benutzer-ID], [PubTime])   VALUES (   2 'www.echina365.com', 'Lily', '2008-10-15   INSERT 00.00.00' ) [Sammeln]   ([CollectId], [URL], [Benutzer-ID], [PubTime])   VALUES (   3 'www.php.com', 'Tom', '2008-10-20   INSERT 00.00.00' ) [Sammeln]   ([CollectId], [URL], [Benutzer-ID], [PubTime])   VALUES (   4, 'www.echina365.com', 'Yaoming', '2008-10-23   INSERT 00.00.00' ) [Sammeln]   ([CollectId], [URL], [Benutzer-ID], [PubTime])   VALUES (   5, 'www.echina365.com', 'Mike', '2008-10-25   INSERT 00.00.00' ) [Sammeln]   ([CollectId], [URL], [Benutzer-ID], [PubTime])   VALUES (   6 'www.sohu.com', 'Jack', '2008-10-26   INSERT 00.00.00' ) [Sammeln]   ([CollectId], [URL], [Benutzer-ID], [PubTime])   VALUES (   7 'www.echina365.com', 'Tracy', "2008.11.02   INSERT 00.00.00' ) [Sammeln]   ([CollectId], [URL], [Benutzer-ID], [PubTime])   VALUES (   8 'www.php.com', 'Yaoming', "2008.11.05   00.00.00' )

     

SET IDENTITY_INSERT [Collect] OFF

War es hilfreich?

Lösung

Da Ihr „mit“ Zustand nicht wirklich auf einer aggregierten Spalte ist, können nicht Sie benutzen Sie einfach das „where“ -Klausel?

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

Dies wird das gleiche Ergebnis angesichts der Datensatz, den Sie angegeben haben. Die LINQ-Anweisung wird dann relativ einfach:

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();

ich Ihre Absicht obwohl werden falsch interpretiert könnte. Vielleicht ist meine Version der Abfrage nicht genau das tun, was Sie wollen. Wenn ja, lassen Sie mir einen Kommentar, und ich werde die Antwort löscht, um das Problem nicht zu verwirren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top