通过降序来命令linq查询

时间:2012-10-17 09:19:03

标签: c# .net linq

我无法弄清楚如何通过LatLong(使用最新条目)使以下查询区别开来:

var query = from ent in db.Entrants
            select new { 
                  ent.idx, 
                  ent.LatLong, 
                  ent.Tip, 
                  ent.FirstName, 
                  ent.City, 
                  ent.Fragrance };

提前感谢您的帮助。

6 个答案:

答案 0 :(得分:2)

这应该这样做:

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降序排序,但您可以将其更改为您喜欢的任何列。

答案 1 :(得分:0)

添加:

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

var sorted = query.OrderBy(x => x.LatLong);

或合并它们:

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

答案 2 :(得分:0)

尝试

var retVal = query.OrderByDescending(x => x.LatLong).Distinct(x => x.LatLong);

答案 3 :(得分:0)

您的问题是匿名类型。

  

因为匿名类型上的Equals和GetHashCode方法是   根据Equals和GetHashcode方法定义   属性,同一匿名类型的两个实例仅在相等时才相等   他们所有的财产是平等的。   MSDN

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

我从未见过收到lambda的distinct的重载。

答案 4 :(得分:0)

这一行

var groups = db.Entrants.GroupBy(ent => ent.LatLong);

将为您提供 groups 的枚举,每个 groups 包含给定LatLong的所有条目。现在,我不知道你怎么知道哪个条目最近,但是如果你知道它们是db.Entrants end 那么你可以使用

var mostRecentPerLatLong = groups.Select(g => g.Last());

或者如果您知道他们在开始,您可以使用

var mostRecentPerLatLong = groups.Select(g => g.First());

或者可能是idx所以你可以使用

var mostRecentPerLatLong =
    groups.Select(g => g.OrderByDescending(e => e.idx).First());

然后你可以创建对象:

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

答案 5 :(得分:0)

听起来你需要使用分组

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 
                };