wie der SQL-Code „mit“ Zustand in LINQ to SQL oder Linq Entities übersetzen?
-
11-07-2019 - |
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
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.