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?

Пожалуйста, вы можете показать мне простой пример.

0 ответов

Другие вопросы по тегам