Entity Framework Core PostgreSQL Linq to SQL Json Field
Извините за мой плохой английский
Примечание: Npgsql не поддерживает JSON-запрос напрямую с EF Core Mapping.
Как вы знаете, PostgreSQL поддерживает JSON и гибридные данные. И если вы хотите сделать запрос, вы можете использовать такой синтаксис
select *
from archive.ArchiveObject
where FileInfo->>'FileName' = 'name.ext';
На мой вопрос вот пример таблицы и пример класса
Таблица:
CREATE TABLE archive."ArchiveObject"
(
"Id" bigint NOT NULL DEFAULT nextval('archive."ArchiveObject_Id_seq"'::regclass),
"Uid" uuid NOT NULL,
...
...
...
"FileInfo" json,
...
...
)
и вот классы C# для этой таблицы
[Table("ArchiveObject", Schema = CX.Schema)]
public partial class ArchiveObject
{
[Key]
public long Id { get; set; }
[Required]
public Guid Uid { get; set; }
[Column("FileInfo", TypeName = "json")]
public string _FileInfo { get; set; }
[NotMapped]
public ObjectFileInfo FileInfo
{
//get;set;
get
{
return string.IsNullOrEmpty(_FileInfo) ? null : JsonConvert.DeserializeObject<ObjectFileInfo>(_FileInfo);
}
set
{
_FileInfo = value != null ? JsonConvert.SerializeObject(value) : null;
}
}
...
...
}
ХОРОШО. Когда я использовал Linq или Lambda, как это не проблема
var query = from x in db.ArchiveObject
where x.Id < 65535
select x;
генерирует
"SELECT x."Id", x."CreatedAt", x."KellePaca", x."Tags", x."Uid", x."UpdateHistory", x."VirtualPathId", x."FileInfo"
FROM archive."ArchiveObject" AS x
WHERE (x."Id" < 65535)
но я не могу запросить JSON области с именем поля FileInfo, как это.
select *
from archive.ArchiveObject
where FileInfo->>'FileName' = 'name.ext' ;
потому что EF не имеет какого-либо провайдера для преобразования в sql "file_info->>'FileName'"
Я искал и нашел эти условия
ExpressionVisitor, QueryProvider, BinaryExpression,
ParameterExpression, ObjectQuery.ToTraceString, Expression
а также нашел эти документы и ответы
Как преобразовать дерево выражений в частичный SQL-запрос?
https://www.codeproject.com/Articles/22819/How-To-LINQ-To-SQL-Part-III
Я считаю, что можно сгенерировать [ file_info->>'FileName' = 'name.ext'; ] запрос с использованием этих документов. Но я не могу получить это.
public static IQueryable<ArchiveObject> FileNameEquals(this IQueryable<ArchiveObject> source, string s)
{
....
}
or what?
Пожалуйста, вы можете показать мне простой пример.