0

对不起,我的英语不好

注意:Npgsql 不支持直接使用 EF Core Mapping 的 json 查询

如您所知,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)

但我不能像这样查询名为 FileInfo 字段的 json 区域。

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?

请你给我看一个简单的例子。

4

0 回答 0