2008-11-26 6 views
0

Pourriez-vous me dire comment traduire le code SQL suivant en Linq To SQL ou Linq To Entites?comment traduire le code SQL "ayant" une condition dans LinqToSQL ou LinqToEntites?

Le code SQL correcte est:

sélectionner CollectId, url, ID utilisateur, pubtime du groupe Collect par url, collectid, ID utilisateur, pubtime ayant pubtime> = (sélectionner max (pubtime) à partir de recueillir d = où d.url collect.url) commande par Collect.pubtime desc

Le script de table de base de données est:

si elle existe (select * from sysobjects où id = OBJECT_ID ('[Récolter]') et OBJECTPROPERTY (id, 'IsUserTable') = 1) DROP TABLE [Récolter]

CREATE TABLE [Récolter] ([CollectId] [entier] IDENTITY (1, 1) NOT NULL, [Url] [nvarchar] (200) NULL, [UserId] [nvarchar] (50) NULL, [PubTime] [datetime] NULL)

ALTER TABLE [Récolter] AVEC NOCHECK AJOUTER CONTRAINTE [PK_Collect] PRIMARY KEY NONCLUSTERED ([CollectId]) SET IDENTITY_INSERT [Récolter] ON

INSERT [Récolter] ([CollectId], [URL], [ID utilisateur], [pubtime]) VALEURS ( 1, 'www.sohu.com', 'Mike ',' 2008-10-10 0:00:00 ') INSÉRER [Collecter] ([CollectId], [Url], [UserId], [PubTime]) VALEURS ( 2,' www.echina365.com ',' Lily ',' 2008-10-15 0:00:00 ') INSÉRER [Collecter] ([CollectId], [Url], [UserId], [PubTime]) VALEURS ( 3,' www .php.com ',' Tom ',' 2008-10-20 0:00:00 ') INSÉRER [Collecter] ([CollectId], [Url], [ID utilisateur], [PubTime]) VALEURS ( 4, 'www.echina365.com', 'YaoMing', '2008-10-23 0:00:00') INSÉRER [Collecter] ([CollectId], [Url], [ID utilisateur], [PubTime]) VALEURS ( 5, 'www.echina365.com', 'Mike', '2008-10-25 0:00:00') INSÉRER [Collecter] ([CollectId], [Url], [UserId], [PubTime]) VALEURS ( 6, 'www.sohu.com', 'Jack', '2008-10-26 0:00:00') INSÉRER [Collecter] ([CollectId], [Url], [UserId], [PubTime]) VALEURS ( 7, 'www.echina365.com', 'Tracy', '2008-11-2 0:00:00') INSÉRER [Collecter] ([CollectId], [Url], [UserId], [PubTime]) VALEURS ( 8, 'www.php.com', 'Yaoming', '05/11/2008 0:00:00')

SET IDENTITY_INSERT [Récolter] OFF

Répondre

2

Depuis votre La condition "ayant" n'est pas réellement sur une colonne agrégée, ne pourriez-vous pas simplement utiliser la clause "où"?

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 

Ceci donne le même résultat étant donné le 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(); 

Cependant, je pourrais mal interpréter votre intention. Peut-être que ma version de la requête ne fait pas exactement ce que vous voulez. Si oui, laissez-moi un commentaire et je vais supprimer la réponse pour ne pas confondre le problème.