8

Я хочу получить результат 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); 

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

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

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

+0

Это EF 4? Если это так, используйте 'ExecuteStoreQuery', и тогда вам не понадобится' Materialize'. –

+0

Нет, это EF 1, но если 'ExecuteStoreQuery' решает мою проблему, я рассмотрю переход на EF4. Можете ли вы поделиться ссылками на некоторые специальные статьи об этом (если они есть). –

+0

Я видел http: // stackoverflow.com/questions/2201369/entity-framework-objectcontext-executestorequery-производит-отсоединенные объекты, и указано, что 'ExecuteStoreQuery' возвращает коллекцию ObjectResult', такую ​​же, как' m_Entities.SomeEntitiyStoredProcedure (1234); '. Похоже, что 'ExecuteStoreQuery' не решит мою проблему. –

ответ

7

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

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

+0

Хорошая идея. Будет ли EF возвращать тот же тип сущности из представления, или я должен сделать еще несколько шагов для этого? Cane вы делитесь некоторым фрагментом кода, работающим с представлением в ef? –

+0

Без EF нет проблем делать то, что он хочет. – erikkallen

+0

Было бы неплохо увидеть пример использования Database View в EF. Мне не интересно это делать без EF. –

-1

sually вы можете получить вокруг этих вопросов с ToList()

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

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

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

+0

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

+0

Решение AsEnumerable() должно делать трюк в этом случае (после редактирования) – erikkallen

+0

(To erikkallen) Но он уже IEnumerable. –

1

Вы можете использовать проект, который я создал, который называется LinqToAnything, который позволяет вам использовать метод запроса доступа без запроса и превратить его в IQueryable.

У меня есть сообщение в блоге here о том, как его использовать.

Смежные вопросы