Запрос длины байта от PostgreSQL с EF Core - PullRequest
0 голосов
/ 28 января 2020

В моем. NET Базовом приложении с Entity Framework Core и Npg sql я бы хотел запросить записи, содержащие двоичные данные. Но иногда мне нужны не фактические данные, а только их длина в байтах. Это будет что-то вроде этого запроса:

dbContext.BinaryFiles
    .Select(f => new
    {
        Name = f.Name,
        Length = f.Data.Length
    }
    .ToList();

Класс файла выглядит следующим образом:

public class BinaryFile
{
    public string Name { get; set; }
    public byte[] Data { get; set; }
}

DbContext содержит DbSet<BinaryFile>. Таблица определяется как:

create table binary_files
(
    id serial primary key,
    name varchar(200) not null,
    data bytea not null
);

Когда я пытаюсь это сделать, я получаю ошибку: Npg sql .PostgresException: «42883: Кардинальность функции (bytea) не существует». Сгенерированный запрос выглядит так:

SELECT b.name AS "Name", cardinality(b.data) AS "Length"
FROM binary_files AS b

Когда я вместо этого пробую этот запрос в интерактивном режиме, я получаю результат:

SELECT b.name AS "Name", LENGTH(b.data) AS "Length"
FROM binary_files AS b

Так что проблема в том, что. NET Array.Length свойство не переведено в адекватную функцию SQL LENGTH, а вместо этого.

Это ошибка или я ее неправильно использую? Как я могу получить только нужные данные?

Версии:

  • . NET Core 3.1.1
  • Entity Framework Core 3.1.1
  • Npg sql 4.1.2
  • Npg sql .EntityFrameworkCore. PostgreSQL 3.1.0
  • PostgreSQL 12 на Windows 10 x64

1 Ответ

1 голос
/ 28 января 2020

Длина перевода в байтовых массивах еще не была реализована ... Использование https://github.com/npgsql/efcore.pg/issues/1226 отслеживает это. Основные поставщики EF Core (SqlServer и Sqlite) недавно объединили поддержку для этого только для 5.0.

...