0

我不知道如何问这个问题,所以我将从一个我正在做的例子开始。

这是我的表结构...

文档(主键 = ID)
ID、标题、LatestApprovedRevID

Revisions (Primary key = ID)
ID, DocumentID, RevisionNum, Body

Document_Reads (主键 = DocumentID, UserName)
DocumentID, UserName, RevisionID

当用户打开文档时,会打开最新批准的修订版,并将一条记录插入到 Document_Reads 中,显示用户已阅读的文档和修订版。我想知道如何使用 Linq 查询以返回 UserName (当前经过身份验证的用户)尚未读取的文档。

要获取未读文档列表,我想在三种情况下返回文档:

  • 如果文档在 Document_Reads 中没有记录。
  • 如果文档在 Document_Reads 中有记录,但它们都不是用于 UserName。
  • 如果文档在 Document_Reads 中有记录并且存在 UserName 的记录,但 Document_Reads.RevisionID 与 Documents.LastApprovedRevID 不匹配。

我已经编写了一个过滤器函数,但是我在编写第二个要求的查询时遇到了问题。如果发现任何与用户名不匹配的 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

我想我想通了。

对于第二个查询,我使用以下代码:

 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 回答