如果不支持多种方法,如何使用LINQ To Entities进行过滤?

时间:2010-04-17 12:05:39

标签: linq linq-to-entities filtering

我在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)。在排序之前,我不想将整个巨大的表拉成数组。有办法吗?

2 个答案:

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

现在可行。