none
Entity Framework Core - возврат нескольких селектов

    Вопрос

  • Всем привет!
    Подскажите, пожалуйста, каким образом можно получить несколько селектов из базы MS SQL с помощью Entity Framework Core ?

    Пробовал нижеуказанный способ
    Но он выдает ошибку: No mapping to a relational type can be found for the CLR type 'Test1'
    На строке var valueBufferFactory = set.GetService<IRelationalValueBufferFactoryFactory>().Create(new[] { typeof(T) }, null);

     
    public void Test()
            {
                using (var cnn = _context.Database.GetDbConnection())
                {
                    var cmm = cnn.CreateCommand();
                    cmm.CommandType = System.Data.CommandType.Text;
                    cmm.CommandText = "select id, name, code from dbo.Test1; select id, name, singleChoice from dbo.Test2";
                    cmm.Connection = cnn;
                    cnn.Open();
                    using (var reader = cmm.ExecuteReader())
                    {
                        var answers = _context.Test1.Translate(reader);
                        reader.NextResult();
                        var questions = _context.Test2.Translate(reader);
                    }
                }
            }

    public static List<T> Translate<T>(this DbSet<T> set, DbDataReader reader) where T : class
            {
                var entityList = new List<T>();
                if (reader == null || reader.HasRows == false) return entityList;
                var entityType = set.GetService<Microsoft.EntityFrameworkCore.Metadata.IModel>().FindEntityType(typeof(T));
                var valueBufferParameter = Expression.Parameter(typeof(ValueBuffer));
                var entityMaterializerSource = set.GetService<IEntityMaterializerSource>();
                var valueBufferFactory = set.GetService<IRelationalValueBufferFactoryFactory>().Create(new[] { typeof(T) }, null);
    
                var stateManager = set.GetService<IStateManager>() as StateManager;
                Func<ValueBuffer, T> materializer = Expression.Lambda<Func<ValueBuffer, T>>(
                        entityMaterializerSource.CreateMaterializeExpression(entityType, valueBufferParameter), valueBufferParameter)
                    .Compile();
                stateManager.BeginTrackingQuery();
                while (reader.Read())
                {
                    ValueBuffer valueBuffer = valueBufferFactory.Create(reader);
                    var entity = materializer.Invoke(valueBuffer);
                    var entry = stateManager.StartTrackingFromQuery(entityType, entity, valueBuffer, null);
                    entityList.Add((T)entry.Entity);
                }
                return entityList;
            }






    • Изменено LightZ 30 ноября 2018 г. 8:23
    30 ноября 2018 г. 8:22

Все ответы

  • Здравствуйте,

    Пробовали через:

    Create(new object[] { typeof(T) }, null);
    ?


    Если Вам помог чей-либо ответ, пожалуйста, не забывайте жать на кнопку "Предложить как ответ" или "Проголосовать за полезное сообщение" Мнения, высказанные здесь, являются отражение моих личных взглядов, а не позиции корпорации Microsoft. Вся информация предоставляется "как есть" без каких-либо гарантий.


    30 ноября 2018 г. 11:34
    Модератор
  • пробовал, метод принимает только массив типов
    30 ноября 2018 г. 11:35