Linq查询获取当前访问区域的人员

时间:2017-04-03 09:36:20

标签: c# entity-framework linq asp.net-web-api azure-sql-database

我正在使用Entity框架的web api作为ADO.NET的对象关系映射(ORM)框架。我需要写一个linq查询,它应该返回一个人最近的5个区域。 enter image description here

附表中描述了各个列的表格。我使用azure sql数据库作为我的后端存储,从上面的数据 我需要通过使用linq查询获得前5个zone_id列表为[4,2,3,2,1] 即可。客户可以请求获取具有 stime 特定范围的区域列表。

2 个答案:

答案 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;是一个整数字段。