Pergunta

Você poderia me dizer como traduzir o seguinte código SQL para LINQ to SQL ou LINQ to Entites?

O código SQL correta é:

selecione CollectId, url, UserID, pubtime Recolha de grupo por url, collectid, UserID, pubtime tendo pubtime> = (max select (pubtime) a partir de d recolha onde d.url = collect.url) fim por Collect.pubtime desc

O script de tabela de banco de dados é:

Se existe (* Selecionar de sysobjects onde ID = OBJECT_ID ( '[Collect]') e OBJECTPROPERTY (ID, 'IsUserTable') = 1) DROP TABLE [Coletar]

CREATE TABLE [Coletar] ([CollectId] [Int] IDENTIDADE (1, 1) não nulo, [Url] [nvarchar] (200) NULL, [UserId] [Nvarchar] (50) NULL, [PubTime] [Datetime] NULL)

ALTER TABLE [Coletar] COM NOCHECK ADD RESTRIÇÃO [PK_Collect] CHAVE PRIMÁRIA NONCLUSTERED ([CollectId]) SET IDENTITY_INSERT [Coletar] ON

Inserir [Coletar] ([CollectId], [Url], [UserId], [PubTime]) VALUES ( 1, 'www.sohu.com', 'Mike', '2008-10-10 00:00:00' ) INSERIR [Collect] ([CollectId], [Url], [UserId], [PubTime]) VALUES ( 2, 'www.echina365.com', 'Lily', '2008-10-15 00:00:00' ) INSERIR [Collect] ([CollectId], [Url], [UserId], [PubTime]) VALUES ( 3 'www.php.com', 'Tom', '2008-10-20 00:00:00' ) INSERIR [Collect] ([CollectId], [Url], [UserId], [PubTime]) VALUES ( 4, 'www.echina365.com', 'Yaoming', '2008-10-23 00:00:00' ) INSERIR [Collect] ([CollectId], [Url], [UserId], [PubTime]) VALUES ( 5, 'www.echina365.com', 'Mike', '2008-10-25 00:00:00' ) INSERIR [Collect] ([CollectId], [Url], [UserId], [PubTime]) VALUES ( 6 'www.sohu.com', 'Jack', '2008-10-26 00:00:00' ) INSERIR [Collect] ([CollectId], [Url], [UserId], [PubTime]) VALUES ( 7 'www.echina365.com', 'Tracy', '2008/11/02 00:00:00' ) INSERIR [Collect] ([CollectId], [Url], [UserId], [PubTime]) VALUES ( 8 'www.php.com', 'Yaoming', '2008/11/05 00:00:00' )

SET IDENTITY_INSERT [Coletar] OFF

Foi útil?

Solução

Uma vez que o seu "ter" condição não é realmente sobre uma coluna agregada, você não pode apenas usar a cláusula "where"?

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

Isto torna-se o mesmo resultado dado o conjunto de dados que você forneceu. A declaração LINQ, em seguida, torna-se razoavelmente simples:

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

Eu poderia estar interpretando mal o que intenção. Talvez a minha versão da consulta não fazer exatamente o que você quer. Se assim for, deixe-me um comentário e eu vou apagar a resposta de modo a não confundir a questão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top