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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top