sql - LINQ-to-SQL:使用 LINQ 查询从每个 GROUP 的顶行中选择多个属性
问题描述
我有两张表,Apps 和 AppGooglePlayMetadatas [AGPM],一个 Apps 行有很多 AGPM。我想选择一组应用程序,并为每个应用程序返回最近 AGPM 行中的一些属性。我可以用这段代码做到这一点:
Apps
.Select(a => new
{
a.Name,
DatePublished = a.AppGooglePlayMetadatas.OrderByDescending(agpm => agpm.DatePublished).Select(agpm => agpm.DatePublished).First(),
CollectionDate = a.AppGooglePlayMetadatas.OrderByDescending(agpm => agpm.DatePublished).Select(agpm => agpm.CollectionDate).First(),
})
但这很丑陋,不能很好地扩展,并导致(可能)低效的 SQL 排序完成两次:
SELECT [t0].[Name], (
SELECT TOP (1) [t1].[DatePublished]
FROM [AppGooglePlayMetadata] AS [t1]
WHERE [t1].[AppId] = [t0].[AppId]
ORDER BY [t1].[DatePublished] DESC
) AS [DatePublished], (
SELECT TOP (1) [t2].[CollectionDate]
FROM [AppGooglePlayMetadata] AS [t2]
WHERE [t2].[AppId] = [t0].[AppId]
ORDER BY [t2].[DatePublished] DESC
) AS [CollectionDate]
FROM [Apps] AS [t0]
这可以像这样写得更简洁一些,但仍然会导致两个 ORDER BY 语句:
Apps
.Select(a => new
{
App = a,
Latest = a.AppGooglePlayMetadatas.OrderByDescending(agpm => agpm.DatePublished).First()
})
.Select(a => new {
a.App.Name,
a.Latest.CollectionDate,
a.Latest.DatePublished,
})
我正在寻找一种方法来查询连接表中特定行的多个属性,从而生成高效的 SQL 查询。如果我打算用 SQL 写这个,我相信我可以像这样最有效地做到这一点:
SELECT TOP 100 a.Name, agpm.CollectionDate, agpm.DatePublished
FROM Apps AS a
CROSS APPLY (
SELECT TOP 1 DatePublished, CollectionDate
FROM AppGooglePlayMetadata AS agpm
WHERE a.AppId = agpm.AppId
ORDER BY DatePublished DESC
) AS agpm
不确定在这种情况下是否有可能让 LINQ 生成如此高效的 SQL,但希望一些天才可以帮助我,谢谢!
解决方案
您可以尝试以下方法:
var result =
Apps.Join(
AppGooglePlayMetadata
.GroupBy(x => x.AppId)
.Select(grp => grp
.OrderByDescending(x => x.DatePublished)
.First()),
x => x.AppId,
x => x.AppId,
(app, meta) => new { app.AppId, meta.DatePublished, meta.CollectionDate });
这会让您获得高效的 SQL 语句吗?
推荐阅读
- java - 我无法通过 pojo 类对象从 firebase 检索嵌套的子对象
- java - 更改列表类型
- java - 如何在 AnyLogic 中指定某些事件(例如按钮按下)背后的汽车目的地
- javascript - 使用下拉列表和 Angular 7 过滤数据
- android - 如何在安卓应用中实现位置搜索?
- c# - 如何使用 Excel 文件中的数据作为数据源 ASP.Net MVC App
- javascript - 用于匹配字符串中的计算的正则表达式
- java - 由于 firebase sdk 依赖,构建失败
- python - 如何在 Python 3.x 中为没有类属性名称的类创建 setter?
- python - 注册时的 NoReverseMatch - Django