0

我快要拔掉剩下的头发了,因为我不知道如何在 SubSonic 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

我已经以至少 10 种不同的方式尝试了以下 SubSonic Select,但我无法让它产生相同的结果。

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

有人可以指出我正确的方向吗?

谢谢!- 安德鲁

4

3 回答 3

1

实际上,您的 SubSonic 选择应该没问题,只需使用 aWhere而不是 a WhereExpression(您得到什么 SQL?)。

我还建议使用 SubSonic 的强类型列而不是魔术字符串——这是使用 SubSonic 的优点之一。

于 2012-02-02T20:41:13.610 回答
1

把我烧死了,但是当它到达这一点时,我通常使用 SqlConnection 对象作为直接传递 SQL。我不确定 SubSonic 2 是否能解决这些复杂问题。

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

SubSonic 3 带来了 AndAlso 运算符来模拟括号,但即使这样也很粗糙。LINQ(在 SubSonic 3 中支持)可能是可靠地做到这一点的唯一方法。

于 2012-03-02T12:36:01.577 回答
0

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

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");
于 2012-02-02T20:21:05.650 回答