В моем. 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