LINQ:根据最新时间通过选定的 ID 获取唯一行
LINQ: Get unique rows by selected ID's based on latest time
我已经成功地使用下面的当前语法和 运行 简单的 LINQ 查询连接到我的数据库。
我有一个包含大约 20 个唯一 SHIP_ID 的数据库,每 2 分钟获取有关所有船只位置的更新信息。这意味着 SHIP_ID 和 TIMESTAMP 组合在一起是唯一的,并且我的数据库中有很多数据,所以我希望负载在 SQL 服务器上以 return 正确的数据。而不是客户端通过 20k 行的响应来找到我想要的值。
我想检索存储在数据库中的一组 select 艘船的最后位置,假设是 SHIP_ID 的 1、2 和 3 号船。截至目前 SHIP_ID 存储在字符串 [] 中。
using (var scope = _scopeFactory.CreateScope())
{
var dbContext = scope.ServiceProvider.GetRequiredService<AisRecordContext>();
var query = dbContext.SimpleAisRecords
//LINQ statements goes here to get intended result
.Where ?
.GroupBy ?
.Select?
.OrderderByDecending ?
}
我怎样才能继续制作正确的 LINQ 语句来获取我想要的数据?我还希望结果将整行 select 作为数据,例如 LAT、LON、SPEED 和 HEADING,它们是我的其他一些列。
我也想知道 return 结果的最佳格式是什么。结果将是 return 行,TIMESTAMP 是我要调用的 SHIP_ID 的最新行。我将需要我的数据库具有的所有列(大约 15 列),因为我将在地图中显示数据。
我会使用 ToList 吗?到阵列?或者以某种方式让我的查询成为结果而不在添加后修改它。
感谢您抽出宝贵时间(对于一个非常具体的问题,我们深表歉意,找不到任何文章的行数乘以 selected ID 的最新日期)
我假设你的 SHIP_ID 是 int
类型?如果是:
var ships = new string[]{ "1","2","3"};
using (var scope = _scopeFactory.CreateScope())
{
var dbContext = scope.ServiceProvider.GetRequiredService<AisRecordContext>();
var result = dbContext.SimpleAisRecords
.Where(r => ships.Any(i => int.Parse(i) == r.SHIP_ID)) //Looks for any records matching any item in ships
.OrderByDescending(r => r.TIMESTAMP); // Orders by time stamp descending...
}
在你可以 select 之后是最新的(这将是我们按时间戳排序后的第一个),如下所示:
var latestShip = result.FirstOrDefault();
至于collection到return的类型,这取决于你之后需要做什么......拥有原始记录会给你带来灵活性,因为你可以更新,删除如果需要的话。
让这件事变得复杂的是,您想要检索具有多艘船的最新时间戳的行。我认为执行此操作的唯一方法是对每个 SHIP_ID 提出请求,并用每个结果填充一个列表。
var lastLocations = new List<SimpleAisRecords>();
var shipIds = new string[] { "1", "2", "3" };
using (var scope = _scopeFactory.CreateScope())
{
var dbContext = scope.ServiceProvider.GetRequiredService<AisRecordContext>();
foreach (var shipId in shipIds)
{
// Gets records for a SHIP_ID, orders by newest to oldest, and then grabs the first (newest) record
var query = dbContext.SimpleAisRecords
.Where(ship => ship.SHIP_ID == shipId)
.OrderderByDecending(ship => ship.TIMESTAMP)
.FirstOrDefault();
if (query != null)
{
lastLocations.Add(query);
}
}
}
默认情况下,它将 return 来自关联 table 的所有列,因此您将拥有 LAT、LON、SPEED、HEADING 以及您需要的所有其他列。
我已经成功地使用下面的当前语法和 运行 简单的 LINQ 查询连接到我的数据库。 我有一个包含大约 20 个唯一 SHIP_ID 的数据库,每 2 分钟获取有关所有船只位置的更新信息。这意味着 SHIP_ID 和 TIMESTAMP 组合在一起是唯一的,并且我的数据库中有很多数据,所以我希望负载在 SQL 服务器上以 return 正确的数据。而不是客户端通过 20k 行的响应来找到我想要的值。
我想检索存储在数据库中的一组 select 艘船的最后位置,假设是 SHIP_ID 的 1、2 和 3 号船。截至目前 SHIP_ID 存储在字符串 [] 中。
using (var scope = _scopeFactory.CreateScope())
{
var dbContext = scope.ServiceProvider.GetRequiredService<AisRecordContext>();
var query = dbContext.SimpleAisRecords
//LINQ statements goes here to get intended result
.Where ?
.GroupBy ?
.Select?
.OrderderByDecending ?
}
我怎样才能继续制作正确的 LINQ 语句来获取我想要的数据?我还希望结果将整行 select 作为数据,例如 LAT、LON、SPEED 和 HEADING,它们是我的其他一些列。
我也想知道 return 结果的最佳格式是什么。结果将是 return 行,TIMESTAMP 是我要调用的 SHIP_ID 的最新行。我将需要我的数据库具有的所有列(大约 15 列),因为我将在地图中显示数据。
我会使用 ToList 吗?到阵列?或者以某种方式让我的查询成为结果而不在添加后修改它。
感谢您抽出宝贵时间(对于一个非常具体的问题,我们深表歉意,找不到任何文章的行数乘以 selected ID 的最新日期)
我假设你的 SHIP_ID 是 int
类型?如果是:
var ships = new string[]{ "1","2","3"};
using (var scope = _scopeFactory.CreateScope())
{
var dbContext = scope.ServiceProvider.GetRequiredService<AisRecordContext>();
var result = dbContext.SimpleAisRecords
.Where(r => ships.Any(i => int.Parse(i) == r.SHIP_ID)) //Looks for any records matching any item in ships
.OrderByDescending(r => r.TIMESTAMP); // Orders by time stamp descending...
}
在你可以 select 之后是最新的(这将是我们按时间戳排序后的第一个),如下所示:
var latestShip = result.FirstOrDefault();
至于collection到return的类型,这取决于你之后需要做什么......拥有原始记录会给你带来灵活性,因为你可以更新,删除如果需要的话。
让这件事变得复杂的是,您想要检索具有多艘船的最新时间戳的行。我认为执行此操作的唯一方法是对每个 SHIP_ID 提出请求,并用每个结果填充一个列表。
var lastLocations = new List<SimpleAisRecords>();
var shipIds = new string[] { "1", "2", "3" };
using (var scope = _scopeFactory.CreateScope())
{
var dbContext = scope.ServiceProvider.GetRequiredService<AisRecordContext>();
foreach (var shipId in shipIds)
{
// Gets records for a SHIP_ID, orders by newest to oldest, and then grabs the first (newest) record
var query = dbContext.SimpleAisRecords
.Where(ship => ship.SHIP_ID == shipId)
.OrderderByDecending(ship => ship.TIMESTAMP)
.FirstOrDefault();
if (query != null)
{
lastLocations.Add(query);
}
}
}
默认情况下,它将 return 来自关联 table 的所有列,因此您将拥有 LAT、LON、SPEED、HEADING 以及您需要的所有其他列。