C# 按降序排序linq查询

C# 按降序排序linq查询,c#,.net,linq,C#,.net,Linq,我无法计算如何通过LatLong(使用最新条目)将以下查询区分开来: 提前感谢您的帮助。添加以下内容: var distinct = query.DistinctBy(x => x.LatLong); // requires MoreLinq 或 或者将它们结合起来: var result = query.DistinctBy(x => x.LatLong).OrderBy(x => x.LatLong); 试一试 你的问题是匿名类型 因为匿名类型上的Equals和GetH

我无法计算如何通过
LatLong
(使用最新条目)将以下查询区分开来:

提前感谢您的帮助。

添加以下内容:

var distinct = query.DistinctBy(x => x.LatLong); // requires MoreLinq

或者将它们结合起来:

var result = query.DistinctBy(x => x.LatLong).OrderBy(x => x.LatLong);
试一试


你的问题是匿名类型

因为匿名类型上的Equals和GetHashCode方法是 根据的Equals和GetHashcode方法定义 属性,相同匿名类型的两个实例只有在 它们的所有性质都是相同的。

为此,使用适当的
Equals
方法定义适当的类型,因为
Distinct
调用嵌套类型的标准
Equals

我从未见过接收lambda的distinct过载。

这应该可以做到:

var query = from ent in db.Entrants
            //get the most recent entry first
            orderby ent.idx descending
            //group the entries by LatLong so we can get a distinct entry for each latlong
            group ent by ent.LatLong into grouped
            //get the most recent one
            let ent = grouped.First()
            select new 
            { 
                ent.idx, 
                ent.LatLong, 
                ent.Tip, 
                ent.FirstName, 
                ent.City, 
                ent.Fragrance 
            };
我不确定您要按哪个列排序以获取最新条目,因此我按idx降序排序,但您可以将其更改为您喜欢的任何列。

此行

var groups = db.Entrants.GroupBy(ent => ent.LatLong);
将为您提供组的枚举,每个组都包含给定
LatLong
的所有条目。现在,我不知道如何判断哪个条目是最新的,但是如果您知道它们即将结束
db.Entrants
,那么您可以使用

var mostRecentPerLatLong = groups.Select(g => g.Last());
var mostRecentPerLatLong = groups.Select(g => g.First());
var mostRecentPerLatLong =
    groups.Select(g => g.OrderByDescending(e => e.idx).First());
或者如果你知道他们在一开始你可以使用

var mostRecentPerLatLong = groups.Select(g => g.Last());
var mostRecentPerLatLong = groups.Select(g => g.First());
var mostRecentPerLatLong =
    groups.Select(g => g.OrderByDescending(e => e.idx).First());
或者可能是通过
idx
,所以您可以使用

var mostRecentPerLatLong = groups.Select(g => g.Last());
var mostRecentPerLatLong = groups.Select(g => g.First());
var mostRecentPerLatLong =
    groups.Select(g => g.OrderByDescending(e => e.idx).First());
然后您可以创建对象:

var query = mostRecentPerLatLong.Select(ent => new { ... } );

听起来你需要使用分组

from ent in db.Entrants
     group ent by ent.LatLong into grp
     let b = grp.OrderByDescending(x=>x.idx).First();
      select new { 
                  b.idx, 
                  b.LatLong, 
                  b.Tip, 
                  b.FirstName, 
                  b.City, 
                  b.Fragrance 
                };

所以你担心顺序或清晰度吗?基本上,我只想从每个lat long中获取最新的条目,所以每个latlong不会获得超过一个条目。当一个新人进来时,我希望他们的latlong能被使用,而不是其他任何具有相同latlong的人。如果有意义,则“无法将lambda表达式转换为IEquality类型,因为它不是委托类型。”Distinct(x=>x.LatLong)上的错误;当然,你是对的;我总是把清晰和清晰混为一谈。为此,您需要MoreLinq库;看,美女!谢谢,我会在3分钟内接受,如果允许的话:)