Member 14800672 Ответов: 1

Как работать с двумя возвращаемыми значениями из SQL в C#?


У меня есть хранимая процедура,которая имеет входные Id и Loc и возвращает Id, Loc и описание, поэтому я создал класс В C# под названием RetrieveDE, который имеет эти три возвращаемых поля

Затем я отредактировал свою хранимую процедуру, чтобы вернуть два выбора вместо одного. И теперь я не знаю, как справиться с обоими вариантами

Что я уже пробовал:

Прежде чем я отредактировал хранимую процедуру:

<pre>
using (TableDBContext table= new TableDBContext())
{
   var result = table.Database.SqlQuery<RetrieveDE>("exec usp_Retrieve 
                @Id, @Loc"
                    , new SqlParameter("Id", id)  //id and loc are input to the method
                    , new SqlParameter("Loc", loc))).ToList();

   return result;   //RetrieveDE has the name of fields that are returned by the 
                             stored procedure which are Id,Loc and Description
}


затем я использую результат в контроллере

Теперь я отредактировал свою хранимую процедуру, чтобы вернуть два результата, я имею в виду, что теперь в хранимой процедуре есть 2 выбора. что я должен сделать в приведенном выше коде, чтобы иметь возможность справиться с этими двумя результатами?
Другой select возвращает DayId и Day?

1 Ответов

Рейтинг:
1

Richard Deeming

В Entity Framework отсутствует встроенная поддержка нескольких результирующих наборов.

Если вы используете EF6, вы можете получить ObjectContext и вручную перевести результаты, как описано в разделе это так ответьте[^]:

using (TableDBContext context = new TableDBContext())
{
    var objectContext = ((IObjectContextAdapter)context).ObjectContext;
    
    using (var command = context.Database.Connection.CreateCommand())
    {
        command.CommandType = System.Data.CommandType.StoredProcedure;
        command.CommandText = "dbo.usp_Retrieve";
        command.Parameters.AddWithValue("@Id", id);
        command.Parameters.AddWithValue("@Loc", loc);
        
        context.Connection.Open();
        
        using (var reader = command.ExecuteReader())
        {
            var firstResultSet = objectContext.Translate<RetrieveDE1>(reader, "Set1", MergeOption.AppendOnly).ToList();
            
            reader.NextResult();
            
            var secondResultSet = objectContext.Translate<RetrieveDE2>(reader, "Set2", MergeOption.AppendOnly).ToList();
            
            return new { firstResultSet, secondResultSet };
        }
    }
}
EF Core не имеет такой возможности и не поддерживает материализацию объектов, которые не являются частью модели. Если вы используете "тип запроса" / "тип сущности без ключа"[^], вы можете использовать что-то вроде настоящий кодекс[^] чтобы материализовать результаты. В противном случае вам придется загружать их вручную.


Member 14800672

что такое возвращаемый тип?

Richard Deeming

Какой бы тип вы ни создали для представления двух результирующих наборов. В этом случае я вернул анонимный тип, но вы, вероятно, захотите создать определенный тип для хранения обоих списков.

Member 14800672

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

Richard Deeming

Извините, но это не имеет смысла. Вы спрашиваете, как написать код для "работы" с двумя списками. Но вы не объяснили, что вы пытаетесь сделать с ними, или где вы застряли.