Условие дозвукового запроса A И ((Условие B И Условие C) ИЛИ (Условие D И Условие E И Условие F) - PullRequest
0 голосов
/ 02 февраля 2012

Я близок к тому, чтобы вырвать оставшиеся волосы, потому что не могу понять, как выполнить следующий запрос T-SQL в SubSonic 2.2:

SELECT  SalesRep, Location, InvoiceNumber, PONumber, POReceivedOn, SurgeryDate, Surgeon
FROM    dbo.vSalesRepCommissionGrouped AS vsrcg
WHERE   UserID IN ( 5, 6, 20 )
    AND ( ( SurgeryDate >= '2012-01-01'
            AND SurgeryDate <= '2012-01-31'
          )
          OR ( SurgeryDate >= '2011-12-01'
               AND SurgeryDate <= '2011-12-31'
               AND POReceivedOn >= '2012-01-01'
             )
        )
ORDER BY SurgeryDate ASC

Я пробовал следующий SubSonic Select по крайней мере 10 различными способами, но не могу получить тот же результат.

new Select("SalesRep, Location, InvoiceNumber, PONumber, POReceivedOn, SurgeryDate, Surgeon")
                    .From(VSalesRepCommissionGrouped.Schema)
                    .WhereExpression("UserID").In(new[] { 5, 6, 20 })
                    .AndExpression("SurgeryDate").IsGreaterThanOrEqualTo(BeginDate).And("SurgeryDate").IsLessThanOrEqualTo(EndDate)
                    .Or("SurgeryDate").IsGreaterThanOrEqualTo(BeginDate.AddMonths(-1)).And("SurgeryDate").IsLessThanOrEqualTo(
                        EndDate.AddMonths(-1)).And("POReceivedOn").IsGreaterThanOrEqualTo(BeginDate).CloseExpression()
                    .OrderAsc("SurgeryDate");

Может ли кто-нибудь указать мне правильное направление?

Спасибо! - Андрей

Ответы [ 3 ]

1 голос
/ 03 февраля 2012

На самом деле, ваш SubSonic выбор должен быть в порядке, просто используйте Where вместо WhereExpression (какой SQL вы получаете?).

Я также рекомендую использовать строго типизированные столбцы SubSonic вместо магических строк - это одно из преимуществ использования SubSonic.

1 голос
/ 02 марта 2012

Сожги меня на костре, но когда доходит до этой точки, я обычно использую объект SqlConnection в качестве проходного SQL напрямую.Я не уверен, что SubSonic 2 отвечает этим сложностям.

Я также не думаю, что скобки, которые вы используете в дозвуковом запросе, на самом деле что-то делают.Они могут влиять на порядок синтаксического анализа критериев, но не на построение окончательного оператора SQL (по крайней мере, не управляемым способом).

В SubSonic 3 оператор AndAlso симулировал скобки, но даже это довольносырой.LINQ (поддерживается в SubSonic 3), вероятно, единственный способ сделать это надежно.

0 голосов
/ 03 февраля 2012

Я не могу сейчас проверить, но, пожалуйста, посмотрите, работает ли этот запрос:

new Select("SalesRep, Location, InvoiceNumber, PONumber, POReceivedOn, SurgeryDate, Surgeon")
                    .From(VSalesRepCommissionGrouped.Schema)
                    .WhereExpression("SurgeryDate").IsGreaterThanOrEqualTo(BeginDate)
                              .And("SurgeryDate").IsLessThanOrEqualTo(EndDate)
                     .OrExpression("SurgeryDate").IsGreaterThanOrEqualTo(BeginDate.AddMonths(-1))
                              .And("SurgeryDate").IsLessThanOrEqualTo(EndDate.AddMonths(-1))
                              .And("POReceivedOn").IsGreaterThanOrEqualTo(BeginDate)
                    .AndExpression("UserID").In(new[] { 5, 6, 20 })
                    .OrderAsc("SurgeryDate");
...