#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, Dictionary2 renameList)
2 Переименовать список)
at System.Data.Entity.Core.Query.InternalTrees.ColumnMapFactory.GetColumnMapsForType(DbDataReader storeDataReader, EdmType edmType, Dictionary
в System.Data.Entity.Core.Query.Внутренние деревья.ColumnMapFactory.Создайте columnmapfromreaderandtype(DbDataReader storeDataReader, EdmType edmType, EntitySet EntitySet, Dictionary2 renameList)
1.b__68()
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
в System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Функция1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
1.b__67()
at System.Data.Entity.Core.Objects.ObjectContext.<>c__DisplayClass69
в System.Data.Entity .SQLServer.DefaultSqlExecutionStrategy.Выполнить[TResult](функция1 operation)
1.<>c__DisplayClass11.b__10()
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
в System.Data.Entity .Внутренний.LazyEnumerator1.MoveNext()
1..ctor(IEnumerable
at System.Collections.Generic.List1 collection)
1 источник)
at System.Linq.Enumerable.ToList[TSource](IEnumerable
в 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()