LINQ查询无法正常工作

时间:2012-05-18 12:12:54

标签: visual-studio-2010 linq entity-framework linq-to-entities

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()时,它完美地工作......

我怎样才能达到同样目的?

3 个答案:

答案 0 :(得分: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个记录中进行多次访问。因此,首先您要按地名过滤列表。然后将访问者的所有访问分组。即你有一组访问。在每个组中,您定义访问者的上次访问时间,然后只选择第一个访问组中的实体,其时间等于该访问者的上次访问日期。

答案 1 :(得分:0)

您可以尝试更改顺序:

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

答案 2 :(得分:0)

您想要获得的独特数据是什么?

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

您可以发布输入数据的样本,获得的输出和预期的输出吗?