Добавить ROW_NUMBER в запрос LINQ для определенного объекта?

Мне нужен запрос EF, чтобы получить номер строки определенного объекта.

Я просмотрел это и это.

В настоящее время у меня это работает следующим образом:

    private DbContext Context;
    public int GetRowNumberQuery<TEntity>(int entityId)
    {
        var allEntities = this.Context.Set<TEntity>().ToList();

        return allEntities
            .Select((entity, index) => new { Index = index, Entity = entity })
            .Where(x => x.Entity.Id == entityId)
            .Select(x => x.Index)
            .SingleOrDefault();
    }

Очевидно, что это очень неэффективно, так как он получает список всех сущностей перед выбором индекса. Если я удалю .ToList() в первой строке, сделав все это запросом LINQ, он выйдет из строя при первом выборе с NotSupportedException, говоря:

LINQ to Entities не распознает метод «System.Linq.IQueryable1[<>f__AnonymousType12[System.Int32,MyEntityType]] Select[MyEntityType,‹>f__AnonymousType12](System.Linq.IQueryable1[MyEntityType], System.Linq.Expressions.Expression1[System.Func3[MyEntityType,System.Int32,‹>f__AnonymousType1 `2[System.Int32,MyEntityType]]])', и этот метод нельзя преобразовать в выражение хранилища.

Подскажите, пожалуйста, как получить ROW_NUMBER определенного объекта? Или это невозможно, как этот довольно старый вопрос предлагает?


person h.alex    schedule 28.02.2015    source источник


Ответы (1)


A) Entity Framework не поддерживает ROW_NUMBER() (приведенные примеры используют EF для создания запроса, а затем «прикрепляют» число к каждой возвращаемой клиентской стороне строки, начиная с 1 и заканчивая n, если есть n строк)

Б) Даже в TSQL запрос будет сложным:

SELECT TOP 1 ROW_NUMBER() OVER (ORDER BY ID) RN FROM SomeTable WHERE ID = 100

вернет NULL, если строк нет, или 1, если есть строка с идентификатором 100.

Вам понадобится что-то вроде

SELECT B.RN 
    FROM 
        (SELECT ID, ROW_NUMBER() OVER (ORDER BY ID) RN 
            FROM SomeTable) B 
    WHERE B.ID = 100

C) Ясно, что вы можете создать представление/хранимую процедуру, которая использует ROW_NUMBERи вызывать ее из EF

person xanatos    schedule 28.02.2015