postgresql 如何在EF Core中过滤、排序和查询LTree

vfh0ocws  于 5个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(73)

如前所述,here我正在努力使用LTree和正确的查询方式。我使用一个对象,包含LTree作为我的一个表上的列。这是对象的外观:

using Microsoft.EntityFrameworkCore;

public class MyObject
{
    public Guid Id {get;set;}
    public LTree LTreeColumn {get;set;}
    ....
}

字符串
如果不可能像预期的那样使用LTree-functions,这并不好,但也不是最坏的情况。但是如果有一种方法,可以基于LTree对集合进行排序和过滤,那就太好了。
OrderBy失败,因为缺少IComparable实现。是否有替代方法?以及如何找到给定特定子路径的“树”上的第一个项目?
比如说,我有一个以Top开头的结构,然后是Top.OneTop.TwoTop.One.One等等。
现在我想在一个集合中找到最高的对象,从Top开始。我如何在数据库和内存中做到这一点?
一般来说(基于公共子路径)如何正确计算<>

nzkunb0c

nzkunb0c1#

这是我到目前为止发现的.如果有人知道得更好或更多,我非常感谢另一个答案。
所有的LTree函数都将被转换为查询。LTree将NLevel作为一个属性,它可以用于排序(作为查询,而不是在内存中):
第一个月
特定路径中的最高值:

var highest = _dbContext.MyObjects.Where(e=>e.LTreeColumn.MatchesLQuery("Top.*"))
    .OrderBy(e=>e.LTreeColumn.NLevel).First();

字符串
如果我需要在内存集合中使用LTreeColumn的级别,我使用这些扩展方法:

public static int GetLTreeLevel(this string lTree)
    => lTree.Split('.').Length;

public static int GetLTreeLevel(this LTree lTree)
    => lTree.ToString().GetLTreeLevel();


比较MyObject的两个示例的级别:

var isHigher = first.LTreeColumn.GetLTreeLevel() < second.LTreeColumn.GetLTreeLevel();

相关问题