0

LINQ 查询无法正常工作

我想做如下,我想在某些条件下从访问者表中访问访问者记录

我想获取访问过该地点的最后 5 位不同访客的列表

我正在使用以下查询来获取结果,但是当涉及 distinct() 时会导致问题, distinct() 会破坏现有订单。

var result = ObjPlace.visitorlist
.where(visitpalce => visitplace.name == Placename)
.OrderByDescending(visitor => visitor.visitdate)
.Select(x => x.visitorID)
.Distinct()
.take(5);

当我删除 distinct() 它完美地工作......

我怎样才能达到同样的效果?

4

3 回答 3

2
 var query = from v in ObjPlace.visitorlist
             where v.name == Placename
             group v by v.visitorID into g
             let lastVisit = g.Max(x => x.visitdate)
             orderby lastVisit descending
             select g.First(v => v.visitdate == lastVisit);

这将返回按上次访问排序的不同实体列表。然后只取其中的前五名:

query.Take(5)

您需要在这里进行分组,因为一位访问者可以在前 5 条记录中进行多次访问。因此,首先您要按地名过滤列表。然后按访客对所有访问进行分组。即您有访问组。在每个组中定义访问者的最后访问时间,然后只需选择组中的第一个访问实体,其时间等于该访问者的最后访问日期。

于 2012-05-18T13:00:14.727 回答
0

您可以尝试更改顺序:

var result = ObjPlace.visitorlist
               .Where(visitpalce => visitplace.name == Placename)
               .Distinct()
               .OrderByDescending(visitor => visitor.visitdate)
               .Select(x => x.visitorID)
               .Take(5);
于 2012-05-18T12:16:54.963 回答
0

您要获取的不同数据是什么?

如果您的对象实现了 IEquatable,那么所有字段都将被比较 - 即,如果两个对象中的日期不同,它们将是不同的,但如果任何其他字段不同,则对象将被视为不同。

你能发布你的输入数据的样本,你得到的输出和预期的输出吗?

于 2012-05-18T12:58:06.940 回答