IQueryable <> из хранимой процедуры (платформа объекта)

Я хочу добраться IQueryable<> закончитесь при выполнении хранимой процедуры.

Вот часть кода, который хорошо работает:

IQueryable<SomeEntitiy> someEntities;  
var globbalyFilteredSomeEntities = 
  from se in m_Entities.SomeEntitiy
    where
      se.GlobalFilter == 1234 
  select se;

Я могу использовать это для применения глобального фильтра и более позднего использования результат в чем-то как:

result = globbalyFilteredSomeEntities
  .OrderByDescending(se => se.CreationDate)
  .Skip(500)
  .Take(10);

Что я хочу сделать - используют некоторые хранимые процедуры в глобальном фильтре.
Я попробовал:

Добавьте хранимую процедуру к m_Entities, но это возвращается IEnumerable<> и сразу выполняет SP:

var globbalyFilteredSomeEntities = 
  from se in m_Entities.SomeEntitiyStoredProcedure(1234);

Осуществите запрос, пользующийся библиотекой EFExtensions, но это IEnumerable<>.
Если я использую AsQueryable() и OrderBy(), Skip(), Take()
и после этого ToList() выполнить тот запрос -
Я получаю исключение это DataReader открыто, и я должен закрыться, это сначала (не может вставить ошибку - это находится на русском языке).

var globbalyFilteredSomeEntities = 
  m_Entities.CreateStoreCommand("exec SomeEntitiyStoredProcedure(1234)")
            .Materialize<SomeEntitiy>();
            //.AsQueryable()
            //.OrderByDescending(se => se.CreationDate)
            //.Skip(500)
            //.Take(10)
            //.ToList();   

Также просто пропуск .AsQueryable() не полезно - то же исключение.
Когда я поместил ToList() запрос выполняется,
но слишком дорого выполнить запрос без Skip(), Take().

9
задан Ray Lionfang 27 June 2019 в 07:52
поделиться

2 ответа

Вы не можете делать то, что пытаетесь сделать, по той же причине, по которой вы не можете поместить хранимую процедуру в предложение FROM запроса SELECT - SQL не поддерживает такого рода операции.

Не могли бы вы поместить желаемую логику в представление вместо хранимой процедуры?

8
ответ дан 4 December 2019 в 23:38
поделиться

В конечном итоге вы можете обойти эти проблемы с помощью ToList ()

var globbalyFilteredSomeEntities = m_Entities.CreateStoreCommand("exec SomeEntitiyStoredProcedure(1234)") 
                                             .Materialize<SomeEntitiy>()
                                             .ToList()  // <<-- added this.
                                             .WhateverYouWant();

. Почему вы не можете выполнить Skip () и Take () для перечисляемого? При этом будут загружены только пропущенные или взятые результаты, остальные не будут прочитаны.

Редактировать: Предыдущая версия была совершенно неправильной во многих аспектах.

-3
ответ дан 4 December 2019 в 23:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: