comment traduire le code SQL "ayant" la condition dans LinqToSQL ou LinqToEntites?
-
11-07-2019 - |
Question
Pouvez-vous me dire comment traduire le code SQL suivant en Linq To SQL ou Linq To Entites?
Le code SQL correct est:
sélectionnez CollectId, url, userid, pubtime de Collect group by url, collectid, userid, pubtime ayant pubtime > = (sélectionnez max (pubtime) dans collect d où d.url = collect.url) commandez par Collect.pubtime desc
Le script de la table de base de données est:
s'il existe (sélectionnez * dans sysobjects où id = OBJECT_ID ('[Collect]') et OBJECTPROPERTY (id, 'IsUserTable') = 1) DROP TABLE [Collect]
CREATE TABLE [Collect] ([CollectId] [int] IDENTITY (1, 1) NOT NULL, [Url] [nvarchar] (200) NULL, [UserId] [nvarchar] (50) NULL, [PubTime] [date / heure] NULL)
ALTER TABLE [Collect] AVEC NOCHECK AJOUTER CONTRAINT [PK_Collect] PRIMARY KEY NON CLUSTERED ([CollectId]) SET IDENTITY_INSERT [Collect] ON
INSÉRER [Collecter] ([CollectId], [Url], [UserId], [PubTime]) VALEURS ( 1, 'www.sohu.com', 'Mike', '2008-10-10 0:00:00 ') INSERT [Collection] ([CollectId], [Url], [UserId], [PubTime]) VALEURS ( 2, 'www.echina365.com', 'Lily', '2008-10-15 0:00:00 ') INSERT [Collection] ([CollectId], [Url], [UserId], [PubTime]) VALEURS ( 3, 'www.php.com', 'Tom', '2008-10-20 0:00:00 ') INSERT [Collection] ([CollectId], [Url], [UserId], [PubTime]) VALEURS ( 4, 'www.echina365.com', 'YaoMing', '2008-10-23 0:00:00 ') INSERT [Collection] ([CollectId], [Url], [UserId], [PubTime]) VALEURS ( 5, 'www.echina365.com', 'Mike', '2008-10-25 0:00:00 ') INSERT [Collection] ([CollectId], [Url], [UserId], [PubTime]) VALEURS ( 6, 'www.sohu.com', 'Jack', '2008-10-26 0:00:00 ') INSERT [Collection] ([CollectId], [Url], [UserId], [PubTime]) VALEURS ( 7, 'www.echina365.com', 'Tracy', '2008-11-2 0:00:00 ') INSERT [Collection] ([CollectId], [Url], [UserId], [PubTime]) VALEURS ( 8, 'www.php.com', 'YaoMing', '2008-11-5 0:00:00 ')
SET IDENTITY_INSERT [Collect] OFF
La solution
Depuis votre " avoir " la condition ne figure pas réellement dans une colonne agrégée, vous ne pouvez pas utiliser simplement l'option "où" et clause?
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
Cela donne le même résultat en fonction du jeu de données que vous avez fourni. L'instruction LINQ devient alors relativement 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();
Je pourrais toutefois mal interpréter votre intention. Peut-être que ma version de la requête ne fait pas exactement ce que vous voulez. Si tel est le cas, laissez-moi un commentaire et je supprimerai la réponse afin de ne pas confondre le problème.