代码之家  ›  专栏  ›  技术社区  ›  SmallChess

当许多方法不受支持时,如何使用linq to实体进行筛选?

  •  0
  • SmallChess  · 技术社区  · 14 年前

    我在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
    

    对于数据中的每个唯一值,我希望筛选出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实体不支持skipwhile(index)和elementat(index)。我不想在排序前将整个巨大的表拉到一个数组中。有办法吗?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Femaref    14 年前

    您可以使用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);
    
        2
  •  0
  •   SmallChess    14 年前

    Femaref的解决方案很有趣,不幸的是,它不起作用,因为每当执行“ObjectContext.DerivedRates.Groupby(dr=>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();
    

    这是可行的。