

リレーションを設定したCoreDataのエンティティ  
`class` 学級  
`student` 学生  
があります。

classには、studentsと言う名前でTo Manyのリレーションをstudentに対して設定します。

studentにはbirthdayと言うAttributeがあるとして、  
classをFetchする際に、studentのbirthdayでソートするにはどうすればいいでしょうか？

つまり、クラスの中で一番早い誕生日の人の順にクラスを並べたいのです。

[code]

    [クラス1]
     Aさん 2010/1/3 生まれ <--クラスの中で一番早い
     Bさん 2010/7/13 生まれ
     Cさん 2010/10/18 生まれ
    
[/code]

[code]

    [クラス2]
     Dさん 2010/6/10 生まれ <--クラスの中で一番早い
     Eさん 2010/8/25 生まれ
     Fさん 2010/12/7 生まれ
    
[/code]

[code]

    [クラス3]
     Gさん 2010/2/8 生まれ <--クラスの中で一番早い
     Hさん 2010/9/10 生まれ
     Iさん 2010/11/7 生まれ
    
[/code]

と、あったとして

[code]

    結果：一番誕生日が早い人だけを対象に並び替える
    クラス1：Aさん 2010/1/3 生まれ 
    クラス3：Gさん 2010/2/8 生まれ
    クラス2：Dさん 2010/6/10 生まれ
    
[/code]

と並べたいのです。  
早生まれは考慮しなくて構いません。  
また、各クラスで2番目以降に早く生まれた人も考慮しないで構いません。

以下の指定はクラッシュしてしまいます。

[code]

    @FetchRequest(
            sortDescriptors: [NSSortDescriptor(key:"@min.class.students.birthday", ascending: true)]
            )
    
[/code]

また、class+CoreDataClass.swift
に「そのクラス内で一番早い誕生日を返すコンピューテッドプロパティ」を作ることは出来ますが、NSSortDescriptorのkeyやkeyPathにコンピューテッドプロパティを指定することは出来ませんでした。


CC BY-SA 4.0
2023-02-08T09:33:46.040
93769
2023-04-05T06:07:01.263
2023-02-08T09:49:30.457
57004
57004
question
swift swiftui coredata
Swift CoreDataでリレーション先の集計値でソートしたい


StudentsをClassのstudentsに入れる(保存)際に、並び替えて入れておくか、もしくは、一番早い人を表示したいときに毎度取得するしかないと思います。

[code]

    let fastestBirthdayStudents = classes.map { $0.students.sorted { $0.birthday < $1.birthday }.first }
    
[/code]


CC BY-SA 4.0
2023-04-05T06:07:01.263
94423
2023-04-05T06:07:01.263
40856
93769
answer