我在SQL数据库中有一个表:
ID Data Value
1 1 0.1
1 2 0.4
2 10 0.3
2 11 0.2
3 10 0.5
3 11 0.6
对于Data中的每个唯一值,我想过滤掉ID最大的行。例如:在上表中,我想过滤掉第三行和第四行,因为第五行和第六行具有相同的数据值,但它们的ID(3)更大(第三行和第四行中有2行)。
我在Linq to Entities中试过这个:
IQueryable<DerivedRate> test = ObjectContext.DerivedRates.OrderBy(d => d.Data).ThenBy(d => d.ID).SkipWhile((d, index) => (index == size - 1) || (d.ID != ObjectContext.DerivedRates.ElementAt(index + 1).ID));
基本上,我正在对列表进行排序,并通过检查下一个元素是否具有相同的ID来删除重复项。
但是,这不起作用,因为Linq to Entities不支持SkipWhile(index)和ElementAt(index)。在排序之前,我不想将整个巨大的表拉成数组。有办法吗?
答案 0 :(得分:1)
您可以使用GroupBy和Max功能。
IQueryable<DerivedRate> test = (from d in ObjectContext.DerivedRates
let grouped = ObjectContext.DerivedRates.GroupBy(dr => dr.Data).First()
where d.Data == grouped.Key && d.ID == grouped.Max(dg => dg.ID)
orderby d.Data
select d);
答案 1 :(得分:0)
Femaref的解决方案很有意思,遗憾的是,它不起作用,因为每当执行“ObjectContext.DerivedRates.GroupBy(dr =&gt; dr.Data).First()”时都会抛出异常。
他的想法激发了我另一种解决方案,就像这样:
var query = from d in ObjectContext.ProviderRates
where d.ValueDate == valueDate && d.RevisionID <= valueDateRevision.RevisionID
group d by d.RateDefID into g
select g.OrderByDescending(dd => dd.RevisionID).FirstOrDefault();
现在可行。