2009-11-06 40 views
0

我不知道如何提出這個問題,所以我將以我正在做的事情爲例。使用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() 

感謝您的幫助,我很抱歉,如果這個問題都可以找到上這個網站已經...我不確定我需要搜索什麼。

+0

你能告訴我們更多關於什麼問題嗎?我猜你寫了一些東西,但沒有做到你想要的。如果是這樣,哪些工作不正確?或者即使開始了第二個查詢,您是否需要幫助? – Rap 2009-11-06 18:22:13

+0

我在過濾器函數的第二個項目符號點或第二個查詢中遇到了問題:「如果文檔在Document_Reads中有記錄,但它們都不是UserName」。 我不知道如何編寫一個linq查詢來做到這一點。如果任何Document_Reads與UserName不匹配,那麼我現在在那裏查詢的查詢將返回一個Document,如果Document_Reads的NONE與UserName匹配,那麼我只需要Document。 – Dragn1821 2009-11-06 18:31:55

回答

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 
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幫我說話吧!

+0

當然。希望我能做得更多。祝賀它得到解決。 – Rap 2009-11-06 23:08:54