почему EF Database.SqlQuery <T>не может использовать тип сущности для частичного выбора? - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть код первого класса для EF:

public partial class table_test
{
    [Key]
    public int pKey { get; set; }

    [Required(AllowEmptyStrings = true)]
    [StringLength(50)]
    public string Name { get; set; }
}

и DbContext:

public class Test_Context : DbContext
{
    public Test_Context()
         : base("name=Conn")
    {
    }

    public DbSet<table_test> table_test { get; set; }
}

Я хочу запросить некоторые данные из этой таблицы:

var items = context.table_test.ToArray();
var items2 = context.Database.SqlQuery<table_test>("SELECT * FROM table_test").ToArray();
var items3 = context.Database.SqlQuery<table_test>("SELECT pKey FROM table_test").ToArray();

Тогда я получил ошибку:

Считыватель данных несовместим с указанным 'UnitTestProject1.table_test. Член типа «Имя» не иметь соответствующий столбец в считывателе данных с тем же именем.

EF Database.SqlQuery with entity type

в чем причина?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Эта строка вызвала исключение, потому что вы выбираете только один столбец, где EF ожидает два столбца, определенных сопоставлением свойств внутри table_test, то есть pKey и Name:

var items3 = context.Database.SqlQuery<table_test>("SELECT pKey FROM table_test").ToArray();

Если вы хотитечтобы выбрать только pKey, просто используйте LINQ Select() из существующего массива items2 (примечание: сначала поставьте using System.Linq;):

var items2 = context.Database.SqlQuery<table_test>("SELECT * FROM table_test").ToArray();
var items3 = items2.Select(x => x.pKey).ToArray();
0 голосов
/ 19 ноября 2018

Как Тецуя Ямамото , упомянутое в комментариях, вы не можете сопоставить класс table_test, когда у вас только "SELECT pKey FROM table_test", потому что у вас есть только pKey.

Я не знаю содержимого вашей БД, поэтому я просто напишу общий ответ Изменить это

"SELECT pKey FROM table_test"

в

"Select * From table_test"

Но, как правило, вы не должны использовать «RAW String во время запросов к БД», добавить слой абстракции поверх него, чтобы было легче, когда вы когда-либо измените имена свойств в DTO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...