0

私は MVC4 プロジェクトに取り組んでおり、2 つのリストを比較してオブジェクトの新しいリストを作成する必要があります。db以下はオブジェクトを指しDbContextます。

私が取り組んでいるプロジェクトでは、2 つのリストを比較する必要があります。最初のものには、学期に提供されるすべての科目があります。もう1つは、学生が選択した科目を持っています。

List<Subject> subjects = db.Subjects;
//...
List<Subject> semesterSubjects = student.Subjects;

この 2 つのリストから、すべての項目が選択されているかどうかを示す項目のリストを作成する必要があります。このように見えます。

class SubjectSelection
{
public int ID { get; set; }
public String Title { get; set; }
public bool IsSelected { get; set; }
}

今必要なのは、比較して取得することsubjectsですsemesterSubjectsIEnumerable<SubjectSelection>

Linq を使用してそのような結果を得ることができますか?

4

2 に答える 2

2

最善の方法は、サーバー側でこのジョブを実行することです。学期の科目から ID を選択してください:

var selectedIDs = semesterSubjects.Select(s => s.ID).ToList();

そしてそれらをクエリに渡します:

var query = db.Subjects.Select(s => new SubjectSelection()
                     {
                        ID = s.ID,
                        Title = s.Title,
                        IsSelected = selectedIDs.Contains(s.ID)
                     });

学期科目リストと科目リストの両方を取得するために同じ db コンテキスト インスタンスを使用している場合は、次のように単純に使用できます。

var query = subjects.Select(s => new SubjectSelection()
                     {
                        ID = s.ID,
                        Title = s.Title,
                        IsSelected = semesterSubjects.Contains(s)
                     });

Entity Framework は ID マップ パターンを実装します。つまり、異なるクエリによって返されるサブジェクト オブジェクトの同じメモリ内インスタンスを返します。

于 2012-12-13T10:05:56.210 に答える
0
var allSubjectsWithSelection = subjects.Select(o=>new SubjectSelection(){ID = o.ID,Title = o.Title, IsSelected = semesterSubjects.Any(s=>s.ID == o.ID)}).ToList();
于 2012-12-13T10:06:15.967 に答える