我无法弄清楚如何通过LatLong
(使用最新条目)使以下查询区别开来:
var query = from ent in db.Entrants
select new {
ent.idx,
ent.LatLong,
ent.Tip,
ent.FirstName,
ent.City,
ent.Fragrance };
提前感谢您的帮助。
答案 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
};