如何翻译的SQL代码“具有” Linq中的状态要SQL或LINQ实体?
-
11-07-2019 - |
题
您能告诉我怎么到下面的SQL代码转换的LINQ to SQL或Linq到entites的?
在正确的SQL代码是:
选择CollectId,URL,用户ID,pubtime 从收集组 URL,collectid,用户ID,pubtime有 pubtime> =(从选择最大值(pubtime) 收集d其中d.url = collect.url) 为了通过Collect.pubtime降序
在数据库表脚本是:
如果存在(来自系统对象选择* 其中id = OBJECT_ID( '[收集]')和 OBJECTPROPERTY(ID, 'IsUserTable')= 1) DROP TABLE [收集]
CREATE TABLE [收集]([CollectId] [INT] IDENTITY(1,1)NOT NULL, [URL] [nvarchar的](200)NULL,[用户Id] [为nvarchar(50)NULL,[PubTime] [日期时间] NULL)
ALTER TABLE [收集] WITH NOCHECK ADD 约束[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 [收集] ([CollectId],[地址],[用户ID],[PubTime]) VALUES( 2, 'www.echina365.com', '百合','2008-10-15 0' 点00分00秒)INSERT [收集] ([CollectId],[地址],[用户ID],[PubTime]) VALUES( 3, 'www.php.com', '汤姆','2008-10-20 0' 点00分00秒)INSERT [收集] ([CollectId],[地址],[用户ID],[PubTime]) VALUES( 如图4所示, 'www.echina365.com', '姚明','2008-10-23 0' 点00分00秒)INSERT [收集] ([CollectId],[地址],[用户ID],[PubTime]) VALUES( 5, 'www.echina365.com', '迈克','2008-10-25 0' 点00分00秒)INSERT [收集] ([CollectId],[地址],[用户ID],[PubTime]) VALUES( 6, 'www.sohu.com', '杰克',“2008-10-26 0' 点00分00秒)INSERT [收集] ([CollectId],[地址],[用户ID],[PubTime]) VALUES( 7, 'www.echina365.com', '崔西','2008-11-2 0' 点00分00秒)INSERT [收集] ([CollectId],[地址],[用户ID],[PubTime]) VALUES( 8, 'www.php.com', '姚明','2008-11-5 0' 点00分00秒)
SET IDENTITY_INSERT [收集] OFF
解决方案
由于您的“具有”条件是不实际的聚合列,不能你只需要使用“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();
我可以尽管误解你的意图。也许我的查询的版本没有做的正是你想要的。如果是这样,给我留下了评论,我会删除了答案,以免混淆问题。