2013-11-15 9 views
0

我寫了一些複雜的LINQ查詢,我試圖對NHibernate運行,不幸的是,當試圖評估查詢(調用.ToList())時會導致異常。LINQ:QuerySyntaxException

下面是代碼,這是應該用一些額外的數據檢索發行對象:

var list = from i in sess.Query<Issue>() 
     let readFlag = (from f in i.ReadFlags 
         where (f.User != null && f.User.Username == request.UserName) 
           || 
           (f.Device.Name == request.MachineName) 
         select f).FirstOrDefault() 
     let isUnread = readFlag == null 
     let unreadCommentsCount = isUnread ? 0 : (from c in i.Comments 
            where c.DateCreated > readFlag.LastSeenCommentDate 
            select c).Count() 

     let statusChanged = isUnread && i.Status != readFlag.LastSeenStatus 
     where isUnread || unreadCommentsCount > 0 || statusChanged 
     select new 
     { 
      Issue = i, 
      ReadFlag = readFlag, 
      IsUnread = isUnread, 
      UnreadCommentsCount = unreadCommentsCount 
     }; 

即 - 每個發行對象查找與IssueReadFlag它匹配當前用戶名或計算機名。如果標記存在,它也包含「上次看到的評論日期」,因此代碼將計算此問題的新評論數。

不幸的是NHibernate不能處理這個查詢(Exception details)。

我正在尋找針對此問題的最佳解決方案。

獲取所有Issue對象並在客戶端應用查詢條件對我來說是不可接受的。


試圖找出是什麼原因導致的問題:它開始工作,因爲我已經在這兩個「選擇」和「地方」的語句註釋掉unreadCommentsCount和statusChanged的評價。在這之後,似乎在任何這些子查詢中引用readFlag都會導致此問題(在刪除對「let unreadCommentsCount ..」和「let statusChanged ..」條件中的readFlag的引用後,查詢不會引發異常)。 現在我需要提示如何使其功能(按預期工作)...

+1

您是否考慮通過從一般'Query '開始縮小問題範圍,並在這些問題中添加這些不同的檢查? – Ocelot20

+0

@ Ocelot20在此期間嘗試了此操作。看到問題的更新 – migajek

回答

0

進一步調查問題我發現NHibernate無法處理readFlag存在的不確定狀態。

我最終將查詢拆分爲兩部分,第一部分將所有問題放在readFlag不存在的地方,第二部分直接查詢IssueReadFlag,計算未讀評論計數和更改狀態。

這似乎是目前唯一的解決方案。