C# 亚音速查询条件A和((条件B和条件C)或(条件D和条件E和条件F)

C# 亚音速查询条件A和((条件B和条件C)或(条件D和条件E和条件F),c#,asp.net,sql-server,subsonic,subsonic2.2,C#,Asp.net,Sql Server,Subsonic,Subsonic2.2,我几乎要把剩下的头发拔出来了,因为我不知道如何在亚音速2.2中执行以下T-SQL查询: SELECT SalesRep, Location, InvoiceNumber, PONumber, POReceivedOn, SurgeryDate, Surgeon FROM dbo.vSalesRepCommissionGrouped AS vsrcg WHERE UserID IN ( 5, 6, 20 ) AND ( ( SurgeryDate >= '2012-01-

我几乎要把剩下的头发拔出来了,因为我不知道如何在亚音速2.2中执行以下T-SQL查询:

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
有人能给我指一下正确的方向吗

谢谢大家!!
-Andrew

我现在无法测试,但请查看此查询是否有效:

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");

实际上,你的亚音速选择应该很好,只需使用
Where
而不是
WhereExpression
(你得到了什么SQL?)


我还建议使用亚音速的强类型列,而不是神奇的字符串,这是使用亚音速的优点之一。

让我火冒三丈,但到了这一点,我通常使用SqlConnection对象作为直接传递SQL。我不确定亚音速2是否能胜任这些复杂的工作

我也不认为您在亚音速查询中使用的括号实际上在做任何事情。它们可能会影响条件的解析顺序,但不会影响最终SQL语句的构造(至少不会以合理可控的方式)


亚音速3引入了AndAlso操作符来模拟括号,但即使这样也很粗糙。LINQ(亚音速3支持)可能是唯一可靠的方法。

这就接近了。它不会在第一个括号和之后打开另一个括号:
WHERE([dbo].[vSalesRepCommissionGrouped].[UserID]in](UserID0In1,UserID0In2,UserID0In3)和([dbo].[vSalesRepCommissionGrouped].[SurgeryDate]>=手术日期2和[dbo].[vSalesRepCommissionGrouped].[SurgeryDate]=手术日期4和[dbo].[vSalesRepCommissionGrouped].[SurgeryDate]=POReceivedOn6))按手术日期ASC排序,
语句周围不需要括号,它们自然优先于
比较。另请参见。怪异。因此:
其中[UserID]在(UserID0In1,UserID0In2,UserID0In3)和([SurgeryDate]>=SurgeryDate 1和[SurgeryDate]=SurgeryDate 3和[SurgeryDate]=porecievedon5)
返回的结果不同于(5,6,20)和(SurgeryDate>='2012-01-01'中的
WHERE UserID和(SurgeryDate='2011-12-01'和SurgeryDate='2012-01-01')
以下是我用来生成亚音速查询的内容:
.WHERE(“UserID”).IN(new[]{5,6,20}.AndExpression(“SurgeryDate”).IsgreetherThanoreQualto(new DateTime)(2012,1,1))。和(“手术日期”)。IsLessThanOrEqualTo(新日期时间(2012,1,31))。或(“手术日期”)。IsLessThanOrEqualTo(新日期时间(2011,12,1))。和(“手术日期”)。IsLessThanOrEqualTo(新日期时间(2011,12,31))。和(“POReceivedOn”)。IsaterOreQualto(新日期时间(2012,1,1))。CloseExpression()
所以我想说亚音速查询是可以的,但是sql server从字符串解释的日期产生的结果与传递日期时间不同-可能是因为日期时间包括默认为00:00:00的小时数?您还需要检查数据库中的SurgerDate(包括小时数?)感谢您的帮助,但这也不起作用。下面是where子句:
where([dbo].[vSalesRepCommissionGrouped].[SurgeryDate]>=SurgeryDate0和[dbo].[vSalesRepCommissionGrouped].[vSalesRepCommissionGrouped].[SurgeryDate]=POReceivedOn5)和中的([dbo].[vSalesRepCommissionGrouped].[UserID](UserID7In1、UserID7In2、UserID7In3))
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");