对不起,我的英语不好
注意: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
并且还找到了这个文件和答案
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?
请你给我看一个简单的例子。