我正在使用Entity框架的web api作为ADO.NET的对象关系映射(ORM)框架。我需要写一个linq查询,它应该返回一个人最近的5个区域。
附表中描述了各个列的表格。我使用azure sql数据库作为我的后端存储,从上面的数据 我需要通过使用linq查询获得前5个zone_id列表为[4,2,3,2,1] 即可。客户可以请求获取具有 stime 特定范围的区域列表。
答案 0 :(得分:1)
不是100%肯定你在问什么,但得到区域ID的列表将是这样的:
var zoneIds = data.Select(z => z.zone_id).Distinct();
这将为您提供各个区域ID。 (distinct会删除重复的区域ID条目)。
如果您想按日期过滤,则类似于:
var zoneIds = data.Where(z => z.stime > [lowerDateTimeBound] && z.stime < [upperDateTimeBound]).Select(z => z.zone_id).Distinct();
对于最近的5个,我会使用:
var zoneIds = data.OrderByDescending(z => z.stime).Select(z => z.zone_id).Distinct().Take(5);
如果要在不删除重复项的情况下获取所有区域,请删除.Distinct()调用。要获得更多结果,请更改Take(x)
个数字。结果应如下:
[1, 2, 3, 4] // With distinct
[1, 1, 2, 2, 3] // Without distinct
更新:根据您的意见。
使用此命令获取区域ID列表:
var zoneIds = data.OrderByDescending(z => z.stime).Select(z => z.zone_id).ToList();
var zoneIdsArray = zoneIds.ToArray();
for(int c = 1; c < zoneIdsArray.Count(); c ++)
{
if (zoneIdsArray[c].zone_id == zoneIdsArray[c-1].zone_id)
{
zoneIds.Remove(zoneIdsArray[c]);
}
}
var last5Zones = zoneIds.Select(z => z.zone_id).ToList().Take(5);
生成的last5Zones列表应该包含最后5个区域的正确列表(根据我认为您从评论中寻找的内容)
答案 1 :(得分:0)
您的问题不清楚预期结果是什么。你声明你想要这个人走过的5个最近的区域,根据你的图片应该得到 [4,2,3,3,2] 然而你说的结果应该是< b> [4,2,3,2,1] 这不是按时间顺序排列的。
尽管如此,您将用于过去记录的5个最近旅行区域的数据的LINQ语句将是:
int[] mostRecentZones = _ctx.OrderByDescending(x=>x.stime).Take(5).Select(x=>x.zone_id).ToArray();
假设&#39; _ctx&#39;是DBContext对象的名称和&#39; stime&#39;是一个DateTime对象和&#39; zone_id&#39;是一个整数字段。