如何在Linq To SQL或Linq实体中转换SQL代码“having”条件?

时间:2008-11-26 05:06:51

标签: sql linq-to-sql linq-to-entities having

您能告诉我如何将以下SQL代码转换为Linq To SQL或Linq To Entites吗?

正确的SQL代码是:

  

选择CollectId,url,userid,pubtime   来自Collect group by   url,collectid,userid,pubtime   pubtime> =(从中选择max(pubtime)   收集d d.url = collect.url)   按Collect.pubtime desc命令

数据库表脚本是:

  

如果存在(从sysobjects中选择*)   其中id = OBJECT_ID('[Collect]')和   OBJECTPROPERTY(id,'IsUserTable')= 1)   DROP TABLE [收集]

     

创建表[收集]([CollectId]   [int] IDENTITY(1,1)NOT NULL,   [url] [nvarchar](200)NULL,[UserId]   [nvarchar](50)NULL,[PubTime]   [datetime] NULL)

     

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

     

INSERT [收集]   ([CollectId],[地址],[用户ID],[PubTime])   价值观(   1, 'www.sohu.com', '迈克','2008-10-10   0:00:00')INSERT [收集]   ([CollectId],[地址],[用户ID],[PubTime])   价值观(   2, 'www.echina365.com', '百合','2008-10-15   0:00:00')INSERT [收集]   ([CollectId],[地址],[用户ID],[PubTime])   价值观(   3, 'www.php.com', '汤姆','2008-10-20   0:00:00')INSERT [收集]   ([CollectId],[地址],[用户ID],[PubTime])   价值观(   如图4所示, 'www.echina365.com', '姚明','2008-10-23   0:00:00')INSERT [收集]   ([CollectId],[地址],[用户ID],[PubTime])   价值观(   5, 'www.echina365.com', '迈克','2008-10-25   0:00:00')INSERT [收集]   ([CollectId],[地址],[用户ID],[PubTime])   价值观(   6, 'www.sohu.com', '杰克',“2008-10-26   0:00:00')INSERT [收集]   ([CollectId],[地址],[用户ID],[PubTime])   价值观(   7, 'www.echina365.com', '崔西','2008-11-2   0:00:00')INSERT [收集]   ([CollectId],[地址],[用户ID],[PubTime])   价值观(   8, 'www.php.com', '姚明','2008-11-5   0' 点00分00秒)

     

SET IDENTITY_INSERT [收集]关闭

1 个答案:

答案 0 :(得分: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();

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