我不知道如何提出這個問題,所以我將以我正在做的事情爲例。使用Linq返回未讀記錄到SQL
這裏是我的表結構...
文件(主鍵= ID)
ID,標題,LatestApprovedRevID
修訂(主鍵= ID)
ID,DocumentID ,RevisionNum,正文
Document_Reads(主鍵= DocumentID,用戶名)
DocumentID,用戶名,修訂ID
當用戶打開文檔時,打開最新批准的修訂,並將記錄插入到Document_Reads中,以顯示用戶已閱讀的文檔和修訂。我想知道如何使用Linq查詢返回未被UserName(當前認證用戶)讀取的文檔。
要獲得未讀文檔列表中,有三種情況下,我想返回文檔:
- 如果一個文檔在Document_Reads沒有記錄。
- 如果文檔在Document_Reads中有記錄,但它們都不是用於UserName的。
- 如果一個文檔在Document_Reads記錄和一個用戶名存在,但Document_Reads.RevisionID不匹配Documents.LastApprovedRevID。
我已經寫了一個過濾器函數,但是我在寫第二個需求的查詢時遇到了問題。如果找到任何與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()
感謝您的幫助,我很抱歉,如果這個問題都可以找到上這個網站已經...我不確定我需要搜索什麼。
你能告訴我們更多關於什麼問題嗎?我猜你寫了一些東西,但沒有做到你想要的。如果是這樣,哪些工作不正確?或者即使開始了第二個查詢,您是否需要幫助? – Rap 2009-11-06 18:22:13
我在過濾器函數的第二個項目符號點或第二個查詢中遇到了問題:「如果文檔在Document_Reads中有記錄,但它們都不是UserName」。 我不知道如何編寫一個linq查詢來做到這一點。如果任何Document_Reads與UserName不匹配,那麼我現在在那裏查詢的查詢將返回一個Document,如果Document_Reads的NONE與UserName匹配,那麼我只需要Document。 – Dragn1821 2009-11-06 18:31:55