2008-11-26 32 views
0

你能告诉我如何将以下SQL代码转换为Linq To SQL或Linq To Entites?如何将SQL代码“有”条件转换为LinqToSQL或LinqToEntites?

正确的SQL代码是:

由 URL,collectid,用户ID,具有 pubtime pubtime选择CollectId,URL,用户ID,pubtime 从收集组> =(选择从 MAX(pubtime)收集d其中d.url = collect.url) 为了通过Collect.pubtime降序

数据库表脚本是:

如果存在(SELECT * FROM系统对象 其中id = OBJECT_ID( '[收集]')和 OBJECTPROPERTY(ID, 'IsUserTable')= 1) DROP TABLE [收集]

CREATE TABLE [收集] ([CollectId] [int] IDENTITY(1,1)NOT NULL, [Url] [nvarchar](200)NULL,[UserId] [nvarchar](50)NULL,[PubTime] [datetime]

ALTER TABLE [Collect] WITH NOCHECK ADD CONSTRAINT [PK_Collect] PRIMARY KEY NONCLUSTERED([CollectId] )SET IDENTITY_INSERT [收集] ON

INSERT [收集] ([CollectId],[地址],[用户ID],[PubTime]) VALUES( 1, 'www.sohu.com','麦克','2008-10-10 0:00:00')INSERT [Collect] ([CollectId],[Url],[UserId],[PubTime]) VALUES( 2,'www.echina365.com ','Lily','2008-10-15 0:00:00')INSERT [Collect] ([CollectId],[Url],[UserId],[PubTime]) VALUES( 3,'www .php.com','Tom','2008-10-20 0:00:00')INSERT [Collect] ([CollectId],[Url],[UserId],[PubTime]) VALUES( 4,'www.echina365.com','YaoMing','2008-10-23 0:00:00')INSERT [Collect] ([CollectId],[Url],[UserId], [PubTime]) VALUES( 5,'www.echina365.com','Mike','2008-10-25 0:00:00')INSERT [Collect] ([CollectId],[Url], [UserId],[PubTime]) VALUES( 6,'www.sohu.com','Jack','2008-10-26 0:00:00')INSERT [Collect] ([CollectId], [Url],[UserId],[PubTime]) VALUES( 7,'www.echina365.com','Tracy','2008-11-2 0:00:00')INSERT [Collect] [CollectId],[Url],[UserId],[PubTime]) 个VALUES( 8, 'www.php.com', '姚明', '2008-11-5 零点○○分00秒')

SET IDENTITY_INSERT [收集] OFF

回答

2

由于您“有”条件实际上并不在一个聚合列上,难道你不能只使用“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 

根据您提供的数据集得到的结果相同。 LINQ语句然后变得相当简单:

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

虽然我可能会误解你的意图。也许我的版本的查询不完全符合你的要求。如果是这样,留下我的评论,我会删除答案,以免混淆问题。