实体框架核心中的Postgres查询出现问题

时间:2019-07-18 11:11:24

标签: c# postgresql entity-framework linq f#

所以我有一个这样的表:

[Table("Box", Schema = "dbo")]
    public partial class Box
    {
        [Column("eventId")]
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [StringLength(200)]
        public int EventId {get;set;}

        [Column("uuid")]
        public int Uuid {get;set;}

        [Column("localIndex")]
        public int LocalIndex {get;set;}

        [Column("rack")]
        public string Rack {get;set;}

        [Column("shelf")]
        public string Shelf{get;set;}

        [Column("fag")]
        public string Fag{get;set;}

        [Column("municipality")]
        public string Municipality {get;set;}

        [Column("organization")]
        public string Organization {get;set;}

        [Column("Entries")]
        public string Entries{get;set;}

    }

数据库是事件驱动的,因此特定盒子的uuid将保持不变,但是其他所有内容可能都会改变,所以我想获取的是所有唯一UUID盒子的最新版本。我可以运行一些简洁的查询来完成此操作吗?

现在作为一个临时解决方案,我只需要找到匹配特定where子句的所有框,然后通过此函数运行结果即可。

let getLatest (list : Box list) = 
    list 
    |> List.filter(fun x -> list 
                            |> List.forall(fun y ->         
                                    not (y.uuid = x.uuid && y.eventId > x.eventId)))

不必说这可能不是最好的方法,但它可以起作用。但是,如果有人有任何想法,将不胜感激。

1 个答案:

答案 0 :(得分:0)

我可以通过按UUID对您的框进行分组,然后按eventId对每个组进行排序并从每个组中获取第一条记录来解决此问题。 在代码中,它看起来像:

let getLatest2 (list : Box list) = 
    list 
    |> List.groupBy (fun x-> x.uuid)
    |> List.map (fun (uuid, values) -> 
                    values 
                    |> List.sortByDescending (fun x->x.eventId) 
                    |> List.head)

说实话,我不确定是否可以使用EF将其正确转换为SQL查询,或者它是否比原始解决方案有任何优势。