0

この質問の仕方がよくわからないので、私がやっていることの例から始めましょう。

これが私のテーブル構造です...

ドキュメント(主キー = 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()

助けてくれてありがとう。このトピックがこのサイトで既に見つかっている場合は申し訳ありません...何を検索する必要があるかわかりませんでした。

4

2 に答える 2

0

私はそれを理解したと思います。

2番目のクエリでは、次のコードを使用しています。

 q = q.Union(From d In query _
                Where (From dr In d.Document_Reads _
                       Where dr.UserName = userName _
                       Select dr).Count = 0 _
                       Select d)

私がそれを話すのを手伝ってくれてありがとうbpayne

于 2009-11-06T18:42:45.503 に答える
0

更新:別の数の式でクエリを結合しようとしたときに発生した別のエラーに遭遇しました。これは、最終的にそれを修正するために私がしなければならなかったことです...

return From d In query _
       Where (d.Document_Reads.Count = 0) Or _
       (From dr In d.Document_Reads _
        Where dr.UserName = userName _
        Select dr).Count = 0 Or _
        (From dr In d.Document_Reads _
         Where dr.UserName = userName And _
         Not (dr.RevisionID = d.LastApprovedRevID) _
         Select dr).Count = 1 _
         Select d
于 2009-11-18T18:53:30.730 に答える