como traduzir o código SQL “ter” condição em LinqToSQL ou LinqToEntites?
-
11-07-2019 - |
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
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.