この質問の仕方がよくわからないので、私がやっていることの例から始めましょう。
これが私のテーブル構造です...
ドキュメント(主キー = ID)
ID、タイトル、LatestApprovedRevID
リビジョン(主キー = ID)
ID、DocumentID、RevisionNum、Body
Document_Reads (主キー = DocumentID、UserName)
DocumentID、UserName、RevisionID
ユーザーがドキュメントを開くと、承認された最新のリビジョンが開かれ、ユーザーが読んだドキュメントとリビジョンを示すレコードが Document_Reads に挿入されます。Linq を使用してクエリを実行し、UserName (現在の認証済みユーザー) が読み取っていないドキュメントを返す方法を知りたいです。
未読ドキュメントのリストを取得するために、ドキュメントを返したい 3 つのケースがあります。
- ドキュメントの Document_Reads にレコードがない場合。
- ドキュメントの Document_Reads にレコードがあるが、UserName のレコードがない場合。
- ドキュメントの Document_Reads にレコードがあり、UserName のレコードが存在するが、Document_Reads.RevisionID が Documents.LastApprovedRevID と一致しない場合。
フィルター関数を作成しましたが、2 番目の要件のクエリを作成するのに問題があります。UserName と一致しない Document_Reads が見つかった場合、ドキュメントが返されます。
<Runtime.CompilerServices.Extension()> _
Public Function FilterLatestUnread(ByVal query As IQueryable(Of Document), ByVal userName As String) As IQueryable(Of Document)
'Documents with no document_reads
Dim q As IQueryable(Of Document) = From d In query _
Where d.Document_Reads.Count = 0 _
Select d
'documents with document_reads but none for userName
q = q.Union(From d In query _
From dr In d.Document_Reads _
Where Not (dr.UserName = userName) _
Select d)
'documents with document_reads for userName but RevisionID does not match LastApprovedRevID
q = q.Union(From d In query _
From dr In d.Document_Reads _
Where dr.UserName = userName And _
Not (dr.RevisionID = d.LastApprovedRevID) _
Select d)
'Return the combined query.
Return q
End Function
次に、承認されたリビジョンを持つすべてのドキュメントをリポジトリに返させ、次のようなフィルターを使用します...
return _repository.List().FilterLatestUnread("John Doe").ToList()
助けてくれてありがとう。このトピックがこのサイトで既に見つかっている場合は申し訳ありません...何を検索する必要があるかわかりませんでした。