如何编写此 LINQ 查询的 SQL 版本?

Posted

技术标签:

【中文标题】如何编写此 LINQ 查询的 SQL 版本?【英文标题】:How can I write an SQL version of this LINQ query? 【发布时间】:2010-11-17 19:58:50 【问题描述】:

如图:How to limit an SQL query to return at most one of something?

我有以下表格:

平台

平台ID 姓名

产品

产品ID 姓名

发布

身份证 产品ID 平台ID 版本 发布日期

版本表存储特定平台的软件产品的每个版本。我想编写一个查询来返回 Releases 表中每个平台的每个产品的最新版本。 IE。如果我在平台 A、B 和 C 上发布产品 X 版本 2.0,Release 表中将有 3 条记录:

2010 年 11 月 17 日发布的平台 A 上的产品 X 2.0 版 2010 年 11 月 17 日发布的平台 B 上的产品 X 2.0 版 2010 年 11 月 17 日发布的平台 C 上的产品 X 2.0 版

那么,给定一个产品 ID,我如何获取此信息?我尝试像我使用的 LINQ 解决方案一样使用 GROUP BY,但显然我不能像 .NET 一样将 LINQ 转换为 SQL。

【问题讨论】:

【参考方案1】:

迂腐的:

Select
  PR.Name,
  PL.Name,
  REL.Version,
  REL.ReleaseDate
From
  Releases As REL
  Inner Join Products As PR
    On REL.ProductID = PR.ProductID
  Inner Join Platforms As PL
    On REL.PlatformID = PL.PlatformID
Where
  REL.ID = (Select Top 1 Latest.ID
            From Releases As Latest
            Where Latest.PlatformID = REL.PlatformID
              And Latest.ProductID = REL.ProductID
            Order By Latest.ReleaseDate Desc)

也应该有效(假设您从不减少版本):

Select
  PR.Name,
  PL.Name,
  Max(REL.Version),
  Max(REL.ReleaseDate)
From
  Releases As REL
  Inner Join Products As PR
    On REL.ProductID = PR.ProductID
  Inner Join Platforms As PL
    On REL.PlatformID = PL.PlatformID
Group By
  PR.Name,
  PL.Name

【讨论】:

非常感谢,第一个解决方案很完美。第二个不适合,因为我对版本使用 Major.Minor.Maintenance.Build 语法,所以我认为 MAX() 不会正确处理。【参考方案2】:

你知道 LINQ 的 DataContext 类有一个Log property吗?

既然您已经有了一个 LINQ 查询,为什么不偷偷看看呢? :-)

【讨论】:

以上是关于如何编写此 LINQ 查询的 SQL 版本?的主要内容,如果未能解决你的问题,请参考以下文章

如何编写异步LINQ查询?

如何在 Linq 中编写嵌套的 Sql 查询 [关闭]

如何在 LINQ 查询中使用自定义方法

如何编写这个 Linq-to-SQL 选择查询

如何使用扩展在Linq Lambda中编写此SQL

如何将此 SQL 内部联接查询转换为 LINQ 语法?