如何翻译 SQL 代码“having” 条件转换为 LinqToSQL 或 LinqToEntites?

发布于 2024-07-09 07:04:19 字数 1663 浏览 8 评论 0原文

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

正确的SQL代码是:

选择 CollectId、url、userid、pubtime 来自收集组依据 url,collectid,userid,pubtime 有 pubtime >=(从中选择 max(pubtime) 收集 d,其中 d.url =collect.url ) 按 Collect.pubtime desc 排序

数据库表脚本为:

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

创建表 [收集] ( [CollectId] [int] IDENTITY (1, 1) NOT NULL, [网址] [nvarchar] (200) NULL,[用户 ID] [nvarchar] (50) NULL,[PubTime] [日期时间] NULL)

使用 NOCHECK ADD 更改表 [收集] 约束 [PK_Collect] 主键 非聚集 ([CollectId]) 集 IDENTITY_INSERT [收集] 开启

插入[收集] ([收集 ID]、[网址]、[用户 ID]、[发布时间]) 值( 1,'搜狐网','Mike','2008-10-10 0:00:00') 插入 [收集] ([收集 ID]、[网址]、[用户 ID]、[发布时间]) 值( 2、'www.echina365.com','莉莉','2008-10-15 0:00:00') 插入 [收集] ([收集 ID]、[网址]、[用户 ID]、[发布时间]) 值( 3、'www.php.com','汤姆','2008-10-20 0:00:00') 插入 [收集] ([收集 ID]、[网址]、[用户 ID]、[发布时间]) 值( 4、'www.echina365.com','姚明','2008-10-23 0:00:00') 插入 [收集] ([收集 ID]、[网址]、[用户 ID]、[发布时间]) 值( 5、'www.echina365.com','Mike','2008-10-25 0:00:00') 插入 [收集] ([收集 ID]、[网址]、[用户 ID]、[发布时间]) 值( 6、'搜狐网','杰克','2008-10-26 0:00:00') 插入 [收集] ([收集 ID]、[网址]、[用户 ID]、[发布时间]) 值( 7、'www.echina365.com','Tracy','2008-11-2 0:00:00') 插入 [收集] ([收集 ID]、[网址]、[用户 ID]、[发布时间]) 值( 8、'www.php.com','姚明','2008-11-5 0:00:00')

设置 IDENTITY_INSERT [收集] 关闭

Could you tell me how to translate the following SQL code to Linq To SQL or Linq To Entites?

The correct SQL code is:

select CollectId,url,userid,pubtime
from Collect group by
url,collectid,userid,pubtime having
pubtime >= (select max(pubtime) from
collect d where d.url = collect.url )
order by Collect.pubtime desc

The database table script is:

if exists (select * from sysobjects
where id = OBJECT_ID('[Collect]') and
OBJECTPROPERTY(id, 'IsUserTable') = 1)
DROP TABLE [Collect]

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

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

INSERT [Collect]
([CollectId],[Url],[UserId],[PubTime])
VALUES (
1,'www.sohu.com','Mike','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','YaoMing','2008-11-5
0:00:00')

SET IDENTITY_INSERT [Collect] OFF

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

つ可否回来 2024-07-16 07:04:19

由于您的“having”条件实际上不在聚合列上,因此您不能只使用“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();

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

Since your "having" condition isn't actually on an aggregated column, couldn't you just use the "where" clause?

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

This gets the same result given the dataset you've supplied. The LINQ statement then becomes reasonably simple:

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

I could be misinterpreting your intent though. Perhaps my version of the query doesn't do exactly what you want. If so, leave me a comment and I'll delete the answer so as not to confuse the issue.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文