1

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

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

提前感谢您的帮助。

4

6 回答 6

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

于 2012-10-17T09:29:04.520 回答
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);
于 2012-10-17T09:23:41.427 回答
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 
                };
于 2012-10-17T09:32:25.463 回答
0

尝试

var retVal = query.OrderByDescending(x => x.LatLong).Distinct(x => x.LatLong);
于 2012-10-17T09:26:30.400 回答
0

你的问题是匿名类型。

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

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

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

于 2012-10-17T09:28:56.050 回答
0

这条线

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());

或者也许它已经过去了,idx所以你可以使用

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

然后你可以创建你的对象:

var query = mostRecentPerLatLong.Select(ent => new { ... } );
于 2012-10-17T09:29:59.447 回答