0

Есть ли способ доступа к набору результатов и выходным параметрам из хранимой процедуры, добавленной в качестве функции импорта в модели Entity Framework?Доступ к выходным параметрам хранимой процедуры И результирующий набор в Entity Framework?

Я обнаружил, что если я установил тип возвращаемого значения в «None», так что код сгенерированного конструктора заканчивается вызовом base.ExecuteFunction(...), что я могу получить доступ к выходным параметрам после вызова функции (но, конечно, не для набора результатов).

С другой стороны, если я установить тип возвращаемого значения в конструкторе в коллекцию сложных типов, то дизайнер сгенерированный код вызывает base.ExecuteFunction<T>(...) и результирующий набор возвращается как ObjectResult<T> но тогда value свойство для ObjectParameter случаев является NULL, а не содержащий что я могу видеть, когда он возвращается в Profiler.

Я предполагаю, что второй метод, возможно, вызывает DataReader и не закрывает его. Это известная проблема? Любая работа вокруг или альтернативные подходы?

Редактировать

Мой код в настоящее время выглядит

public IEnumerable<FooBar> GetFooBars(
     int? param1, 
     string param2, 
     DateTime from, 
     DateTime to, 
     out DateTime? createdDate, 
     out DateTime? deletedDate) 
    { 
     var createdDateParam = new ObjectParameter("CreatedDate", typeof(DateTime)); 
     var deletedDateParam = new ObjectParameter("DeletedDate", typeof(DateTime)); 

     var fooBars = MyContext.GetFooBars(param1, param2, from, to, createdDateParam, deletedDateParam); 

     createdDate = (DateTime?)(createdDateParam.Value == DBNull.Value ? 
      null : 
      createdDateParam.Value); 

     deletedDate = (DateTime?)(deletedDateParam.Value == DBNull.Value ? 
      null : 
      deletedDateParam.Value); 

     return fooBars; 
    } 
+0

Если вы используете инфраструктуру сущности, у вас действительно должна быть чистая модель домена. Какие вещи вы пытаетесь загрузить в свою модель, где требуется эта странная процедура двойного вывода? Это было сделано для того, чтобы справиться с каким-то ограничением производительности? – JDPeckham

+0

@JDPeckham - Не особенно странно ИМО. Выходные параметры содержат некоторые данные заголовка о результате, а результирующий набор содержит строки данных. Набор результатов хранимой процедуры содержит довольно сложную логику, которую я не хочу запускать дважды, и Entity Framework не может эффективно работать. Так возможно или нет? (Тем временем я просто использую ADO.NET и DataReader, но поскольку он может сделать то или другое, я хотел бы знать, можно ли сделать оба) –

ответ

3

Согласно this SO пост, то sproc фактически не выполнять до тех пор, пока итерируем ResultSet. Я смоделировал ваш сценарий, провел несколько тестов и подтвердил, что это так. Вы не добавили образец кода, поэтому я не вижу, что вы делаете в точности, но в соответствии с вашим ответом ниже попробуйте кэшировать resulset в списке (например, Context.MyEntities.ToList()), а затем проверьте значение ObjectParameter

+0

Я не перечисляю результат. Все это происходит в методе ['base.ExecuteFunction (...)'] (http://msdn.microsoft.com/en-us/library/bb739018.aspx), который выполняет итерацию через него и возвращает набор сильно набранные объекты в соответствии с отображениями в дизайнере. –

+0

Да, это была проблема. Я делал что-то вроде «var s = context.MySp (param1); var p = param1.Value; return s; '. Это устранило проблему. Благодаря! –