Я хочу добраться 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()
.
Вы не можете делать то, что пытаетесь сделать, по той же причине, по которой вы не можете поместить хранимую процедуру в предложение FROM запроса SELECT - SQL не поддерживает такого рода операции.
Не могли бы вы поместить желаемую логику в представление вместо хранимой процедуры?
В конечном итоге вы можете обойти эти проблемы с помощью ToList ()
var globbalyFilteredSomeEntities = m_Entities.CreateStoreCommand("exec SomeEntitiyStoredProcedure(1234)")
.Materialize<SomeEntitiy>()
.ToList() // <<-- added this.
.WhateverYouWant();
. Почему вы не можете выполнить Skip () и Take () для перечисляемого? При этом будут загружены только пропущенные или взятые результаты, остальные не будут прочитаны.
Редактировать: Предыдущая версия была совершенно неправильной во многих аспектах.