Как использовать LINQ To Entities для фильтрации, когда многие методы не поддерживаются? - PullRequest
0 голосов
/ 17 апреля 2010

У меня есть таблица в базе данных 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 я хочу отфильтровать строку с наибольшим идентификатором. Например: в приведенной выше таблице я хочу отфильтровать третью и четвертую строку, поскольку пятая и шестая строки имеют одинаковые значения данных, но их идентификаторы (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));

По сути, я сортирую список и удаляю дубликаты, проверяя, имеет ли следующий элемент идентичный идентификатор.

Однако это не работает, потому что SkipWhile (index) и ElementAt (index) не поддерживаются в Linq to Entities. Я не хочу вытягивать всю гигантскую таблицу в массив перед сортировкой. Есть ли способ?

Ответы [ 2 ]

1 голос
/ 17 апреля 2010

Для этого вы можете использовать функции 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);
0 голосов
/ 18 апреля 2010

Решение Femaref интересно, к сожалению, оно не работает, потому что возникает исключение всякий раз, когда выполняется «ObjectContext.DerivedRates.GroupBy (dr => dr.Data) .First ()».

HisИдея вдохновила меня на другое решение, примерно так:

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

Теперь это работает.

...