Запрос таблицы SQL с использованием Entity Framework

#c# #entity-framework

#c# #entity-framework

Вопрос:

Я новичок в Entity Framework, и я пытаюсь запросить одну из своих таблиц и возвращаю данные только из одного столбца. Я использовал этот код:

 using (var ctx = new TestEntities())
{
    var Pokemon = ctx.C__PokemonName
                     .SqlQuery("select pokemon from __pokemonname")
                     .ToList();

    foreach (var pokemonname in Pokemon)
        MessageBox.Show(Convert.ToString(pokemonname));
}
  

Этот код выдает ошибку:

System.Data.Entity.Core.EntityCommandExecutionException
HResult=0x8013193C
Сообщение= Средство чтения данных несовместимо с указанной ‘TestModel.C__PokemonName’. Член типа ‘ID’ не имеет соответствующего столбца в считывателе данных с тем же именем.

Источник=EntityFramework

Трассировка стека:
в System.Data.Entity.Core.Query.Внутренние деревья.ColumnMapFactory.GetMemberOrdinalFromReader(DbDataReader storeDataReader, EdmMember member, EdmType currentType, Dictionary 2 renameList)
at System.Data.Entity.Core.Query.InternalTrees.ColumnMapFactory.GetColumnMapsForType(DbDataReader storeDataReader, EdmType edmType, Dictionary
2 Переименовать список)
в System.Data.Entity.Core.Query.Внутренние деревья.ColumnMapFactory.Создайте columnmapfromreaderandtype(DbDataReader storeDataReader, EdmType edmType, EntitySet EntitySet, Dictionary 2 renameList)
at System.Data.Entity.Core.Objects.ObjectContext.InternalTranslate[TElement](DbDataReader reader, String entitySetName, MergeOption mergeOption, Boolean streaming, EntitySetamp; entitySet, TypeUsageamp; edmType)
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQueryInternal[TElement](String commandText, String entitySetName, ExecutionOptions executionOptions, Object[] parameters)
at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass69
1.b__68()
в System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Функция 1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass69
1.b__67()
в System.Data.Entity .SQLServer.DefaultSqlExecutionStrategy.Выполнить[TResult](функция 1 operation)
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQueryReliably[TElement](String commandText, String entitySetName, ExecutionOptions executionOptions, Object[] parameters)
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteStoreQuery[TElement](String commandText, String entitySetName, ExecutionOptions executionOptions, Object[] parameters)
at System.Data.Entity.Internal.Linq.InternalSet
1.<>c__DisplayClass11.b__10()
в System.Data.Entity .Внутренний.LazyEnumerator 1.MoveNext()
at System.Collections.Generic.List
1..ctor(IEnumerable 1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable
1 источник)
в PokeForm.Form1..ctor() в F:VS ProjectsPokeFormPokeFormForm1.cs:строка 28
в PokeForm.Program.Main() в F:VS ПроектыPokeFormPokeFormProgram.cs:строка 19

Комментарии:

1. Почему вы используете SqlQuery вместо использования EF, как он был разработан для работы?

2. Если вы хотите, вы можете добавить свой __pokemonname класс модели в вопрос, чтобы я мог перепроверить, верен ли мой ответ, и добавить некоторые пояснения..

Ответ №1:

Самый простой способ select * (выбрать все столбцы) следующий:

 using (var ctx = new TestEntities())
{
    var pokemonList = ctx.C__PokemonName.ToList();

    foreach (var pokemon in pokemonList)
        MessageBox.Show(Convert.ToString(pokemon.pokemonname));
}        
  

Если вы хотите запрашивать только для одного столбца, вам следует использовать i.e Dapper-library с пользовательским sql ( select pokemonname from __pokemonname ) или вы можете выбрать один столбец с помощью Linq.Операция выбора и прогнозируемый анонимный тип.

 using (var ctx = new TestEntities())
{
    var pokemonNameList = ctx.C__PokemonName.Select(r => new { pokemonname = r.pokemonname }).ToList();

    foreach (var name in pokemonNameList)
        MessageBox.Show(Convert.ToString(name.pokemonname));
}        
  

Комментарии:

1. Есть ли способ выбрать возрастание?

2. Да, вы также можете выбрать возрастание. Добавить: .OrderBy(r=>r.pokemonname) перед .ToList()