2011-09-21 44 views
2

現在我使用NHibernate 3.2作爲ORM,當我寫這樣的代碼:nhibernate to linq 3.2在||上生成錯誤sql運營商

PostReaderBll postReaderBll=new PostReaderBll(); 
    var query = from p in postReaderBll.Query() 
       where (p.Post.Flag == (int)PostType.Post && p.Post.MailState == (int)MailState.Normal) || (p.ReceiveUser == LoginUser.UserIdentity && p.Post.Flag == (int)PostType.Mail && p.Post.MailState == (int)APSP.Form.MailState.Normal) 
       select p; 

我得到這個SQL:

SELECT TOP (10 /* @p0 */) ID1_70_, 
       IsRead2_70_, 
       ReceiveU3_70_, 
       ReadDate4_70_, 
       Flag5_70_, 
       Label6_70_, 
       PostID7_70_ FROM  (select postreader0_.[ID]  as ID1_70_, 
      postreader0_.[IsRead]    as IsRead2_70_, 
      postreader0_.[ReceiveUser]   as ReceiveU3_70_, 
      postreader0_.[ReadDate]   as ReadDate4_70_, 
      postreader0_.[Flag]    as Flag5_70_, 
      postreader0_.[Label]    as Label6_70_, 
      postreader0_.[PostID]    as PostID7_70_,  ROW_NUMBER() 
       OVER(ORDER BY CURRENT_TIMESTAMP) as __hibernate_sort_row 
     from PostReader postreader0_ 
      inner join Post post1_ 
       on postreader0_.[PostID] = post1_.[ID] 
     where post1_.[Flag] = 1 /* @p1 */ 
      and post1_.[MailState] = 0 /* @p2 */ 
       or postreader0_.[ReceiveUser] = 'admin' /* @p3 */ 
       and post1_.[Flag] = 0 /* @p4 */ 
       and post1_.[MailState] = 0 /* @p5 */) as query WHERE query.__hibernate_sort_row > 0 /* @p6 */ ORDER BY query.__hibernate_sort_row 

,但我需要像這樣的地方:

(post1_.[Flag] = 1 /* @p1 */ 
      and post1_.[MailState] = 0 /* @p2 */) 
       or (postreader0_.[ReceiveUser] = 'admin' /* @p3 */ 
       and post1_.[Flag] = 0 /* @p4 */ 
       and post1_.[MailState] = 0 /* @p5 */) 

回答

1

這是相同的,因爲OR運算符總是在AND運算符之後被評估。

爲OR操作參考文檔:

結合了兩個條件。當在一個聲明中使用多於一個邏輯運算符 時,或運算符在AND運算符之後被評估。 但是,您可以使用括號更改評估的順序。

http://msdn.microsoft.com/en-us/library/ms188361.aspx