6

私はこの2つのエンティティを持っています:

public class Course
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
    public virtual ICollection<Class> Classes { get; set; }
}

public class Class
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime StartTime { get; set; }
    public DateTime EndTime { get; set; } ]
    public Course Course { get; set; }
}

ここで、Course ごとにグループ化された各 Class をリストし、Course.StartDate の順 (降順)、次に Class.StartTime の順に並べる必要があります。Course ごとにグループ化し、Course.StartDate ごとに並べ替えることができます。

var myList = context.Classes
    .GroupBy(c => c.Course)
    .OrderByDescending(g => g.Key.StartDate).ToList()

しかし、StartTime で各クラスを並べ替えることもできません。私はこれを試しました:

var myList = context.Classes
    .OrderBy(c => c.StartTime)
    .GroupBy(c => c.Course)
    .OrderByDescending(g => g.Key.StartDate).ToList()

そしてこれさえ:

var myList = context.Classes
    .GroupBy(c => c.Course)
    .OrderByDescending(g => g.Key.StartDate)
    .ThenBy(g => g.Select(c => c.StartTime)).ToList()

ただし、クラスは StartTime によって順序付けられることはありません。

*より明確にするために編集:これはWebService用でありList<IGrouping<Course, Class>>、リストを手動で作成せずに、これを行うエレガントな方法(Linqのみを使用)が本当に必要です。もちろん、それが不可能でない限り。

どんな助けも感謝しています(私はEFコードファースト4.3 btwを使用しています)。

4

3 に答える 3

2

署名を保持する必要がある場合は、次のことをお勧めします。

var myList = context.Classes
                    .GroupBy(cc => cc.Course)
                    .OrderByDescending(gg => gg.Key.StartDate)
                    .ToArray() // <- stops EF and starts L2O
                    .SelectMany(gg => gg.OrderBy(cc => cc.StartTime))
                    .ToLookup(cc => cc.Course, cc => cc)
                    .ToList();

これにより、ある種の署名が作成されます。List<IGrouping<Course, Class>>そして、それらは。によって適切に順序付けられStartTimeます。ToLookupこれは、見つかった順序を維持することに関するの動作に依存しており、変更される可能性があります。

于 2012-04-24T13:12:44.117 に答える
2

リストのリストが本当に必要なようです。ネストされた各リストは、あなたが言及した追加の基準で並べられています。でグループ化しているため、グループ内の各エントリの開始日は同じであるため、グループを開始日でCourse並べ替えることができます。次に、グループ化された要素を開始時間順に並べたリストに射影できます。

var myList = context.Classes
    .GroupBy(c => c.Course)
    .OrderByDescending(g => g.Key.StartDate)
    .Select(g => g.OrderBy(c => c.StartTime).ToList())
    .ToList();
于 2012-04-09T22:13:32.113 に答える
1

EF は直接 SQL を作成するため、同じ SQL で順序付けを含むグループ化を行うことはできません。

EF を使用し、ToList() で終わる 1 つの Linq ステートメントでグループ化を行うことをお勧めします。そして、2 番目の Linq ステートメントとして (メモリ内の) Linq To Objects を使用して並べ替えを行います。

オブジェクトはすでにグループ化されているため、これは高速に実行されるはずです。

したがって、そのようなものが機能するはずです:

var myList = context.Classes
    .GroupBy(c => c.Course).ToList()
    .OrderByDescending(g => g.Key.StartDate).ToList()
于 2012-04-24T12:50:52.883 に答える