私はtbStudentsの学生を基本的に受け取り、tbTermsに最新の用語(数字ですが、文字列として格納されます)を取得するSQLクエリ(下記)を持っています。SQL - > LINQ(C#)
tbStudentsの学生とtbTermsの用語レコードの間に1対多の関係があります。例:
tbStudents:
StudentId FirstName LastName
12345 John Smith
12346 Jane Doe
tbTerms:理想の
StudentId Term
12345 1234
12345 1235
12345 1236
12346 1233
12346 1234
:
StudentId FirstName LastName Term
12345 John Smith 1236
12346 Jane Doe 1234
SQLクエリ:
select tbStudents.student_id, tbStudents.user_id, tbStudents.firstname, tbStudents.lastname, v.rTerm
from tbStudents
inner join (
select tbTerms.student_id, MAX(tbTerms.term) as rTerm
from tbTerms
group by tbTerms.student_id
) v on v.student_id = tbStudents.student_id
私はこれをすべて1つのLINQ文にしようとしていますが、問題があります。 1つの声明でこれを行うためにとにかくありますか?複数のステートメントで実行する必要があります。ありがとうございました。
編集:私が試したことのC#コード。
var students = (from s in dockDb.tbStudents
join t in dockDb.tbTerms on s.student_id equals t.student_id
into pairs
from p in pairs
select new { UserId = s.user_id, StudentId = s.student_id, Term = p.term }).ToList();
出力は次のようになります。
StudentId FirstName LastName Term
12345 John Smith 1234
12345 John Smith 1235
12345 John Smith 1236
12346 Jane Doe 1233
12346 Jane Doe 1234
編集#2:私は、データのためのEntity Frameworkのを使用しています。私はこれが何かに影響を与えるかどうかはわかりませんが、私が試してみると、ほとんどの解決策は「構文上正しくありません」です。より読みやすく書くのが自然であることを拡張メソッドを持つ
from s in dockDb.tbStudents
join t in dockDb.tbTerms on t.student_id equals s.student_id into st
group st by New {StudentID = st.student_id, Term = t.term} into g
select New { g.Key, g.Max(i => i.Term) }
あなたが既に持っているかを示すことはできますか? –
"構文的に正しくありません"。拡張機能AsEnumerable()を呼び出します。そして、それらは "統語的に間違った"ものではありません。 – OmegaMan