IQueryable <> из хранимой процедуры (структура сущности) - PullRequest
9 голосов
/ 05 мая 2010

Я хочу получить 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().

Ответы [ 3 ]

8 голосов
/ 05 мая 2010

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

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

1 голос
/ 24 июня 2015

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

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

0 голосов
/ 05 мая 2010

как правило, вы можете обойти эти проблемы с помощью ToList ()

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

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

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

...