nhibernate на linq 3.2 генерирует ошибку sql на || оператор - PullRequest
2 голосов
/ 21 сентября 2011

Теперь я использую nhibernate 3.2 в качестве нормы, когда я пишу код, подобный этому:

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 Ответ

1 голос
/ 04 ноября 2011

Это то же самое, потому что операторы OR всегда вычисляются после операторов AND.

Справочная документация для оператора ИЛИ:

Сочетает два условия. Когда используется более одного логического оператора в операторе операторы OR оцениваются после операторов AND . Однако вы можете изменить порядок оценки, используя скобки.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...