0

これらの 4 つの多対多の関連エンティティを持つ DbContext があります。

Classes <-> Students
Classes <-> Assignments
Classes <-> Contents
Classes <-> Announcements

ここで、 StudentId = X の学生がクラスに所属している各クラスの最後の3 つの Assignments最後の 3 つの Contents最後の 3 つの Announcementsを提供する Linq コード (またはより良い!) が必要です。

一方、学生はウェブサイトにログインし、学生がそこで勉強している各クラスの最後の課題、内容、お知らせを表示したいと考えています。

このコードは正しくありませんが、私のニーズを理解するのに役立つかもしれません. また、このコードの実行には何度も時間がかかります (50ms は多くありませんか?):

編集:コードはほぼ正しかったので、回答に移動し、受け入れられた回答を見てください。他の(より優れた、より高速な)ソリューションは高く評価されます。

前もって感謝します。

4

2 に答える 2

0

Based on @Gert Arnold recommendation I had changed a little my code:

  • start the query with student
  • narrow down the result by changing selected properties
db.Students.Where(st => st.StudentId.Equals(CurrentUser)).SelectMany(S => S.Classes, (S, C) => new
{
    Name = C.Name,
    Assignments = C.Assignments.Select(AS => new { AS.Id, AS.Name }).OrderByDescending(As => As.Id).Take(3),
    Contents = C.Contents.Select(Co => new { Co.Id, Co.Title }).OrderByDescending(Co => Co.Id).Take(3),
    Announcements = C.Announcements.Select(An => new { An.Id, An.Title }).OrderByDescending(An => An.Id).Take(3)
});
于 2013-03-01T19:30:05.427 に答える
0

学生からクエリを開始することをお勧めします。

from s in db.Students
where s.StudentId == CurrentUser
from c in s.Classes
from as in c.Assignments.OrderByDescending(As => As.Id).Take(3)
from co in c.Contents.OrderByDescending(Co => Co.Id).Take(3)
from an in c.Announcements.OrderByDescending(An => An.Id).Take(3)
select new { <selected properties> }

最後の部分 (選択されたプロパティ) は重要です。プロパティのサブセットのみを選択することで、データベースから結果セットを絞り込みます。これがないと、(SQL) クエリに多数の結合があるため、非常に幅広く長い結果セットが作成されます。

于 2013-02-28T22:03:04.827 に答える