【问题标题】:Subsonic 3 ActiveRecord nested select for NotIn bug?Subsonic 3 ActiveRecord 嵌套选择 NotIn 错误?
【发布时间】:2010-06-08 06:48:04
【问题描述】:

我有以下 Subsonic 3.0 查询,其中包含一个嵌套的 NotIn 查询:

public List<Order> GetRandomOrdersForNoReason(int shopId, int typeId)
{
    // build query    
    var q = new SubSonic.Query.Select().Top("1")
        .From("Order")
        .Where("ShopId")
        .IsEqualTo(shopId)
        .And(OrderTable.CustomerId).NotIn(
            new Subsonic.Query.Select("CustomerId")
                .From("Customer")
                .Where("TypeId")
                .IsNotEqualTo(typeId))
            .OrderDesc("NewId()");

    // Output query
    Debug.WriteLine(q.ToString());   

    // returned typed list
    return q.ExecuteTypedList<Order>();
}

内部查询似乎不正确:

SELECT TOP 1 *
 FROM [Order]
 WHERE ShopId = @0 AND CustomerId NOT IN (SELECT CustomerId
 FROM [Customer]
 WHERE TypeId = @0)
 ORDER BY NewId() ASC

您会注意到这两个参数都是 @0。我假设为每个“新”选择查询枚举参数(从零开始)。但是,在这种两个 Select 查询嵌套的情况下,我希望输出有两个名为 @0@1 的参数。

我的查询基于 Rob Conery 在他的博客上提供的 one 作为 Subsonic 3 的“Pakala”查询工具的预览。他的示例是:

int records = new Select(Northwind.Product.Schema)
    .Where("productid")
    .In(
        new Select("productid").From(Northwind.Product.Schema)
        .Where("categoryid").IsEqualTo(5)
        )
    .GetRecordCount();

还有其他人看到过这种行为吗?这是一个错误,还是一个错误或我的部分?由于我是 Subsonic 的新手,我猜测这可能是我的程序员错误,但如果可能的话,我想确认一下。

【问题讨论】:

    标签: c# activerecord subsonic subsonic3


    【解决方案1】:

    刚刚在最新版本中遇到了完全相同的问题,因此显然尚未修复。我尝试切换条件的顺序(首先放置 NotIn 条件)并且成功了。下面是新代码的样子,它产生了参数@0 和@1 而不是@0 和@0:

    var q = new SubSonic.Query.Select().Top("1")
        .From("Order")
        .Where(OrderTable.CustomerId).NotIn(
            new Subsonic.Query.Select("CustomerId")
                .From("Customer")
                .Where("TypeId")
                .IsNotEqualTo(typeId)
        )
        .And("ShopId")
        .IsEqualTo(shopId)
        .OrderDesc("NewId()");
    

    【讨论】:

      【解决方案2】:

      我不确定 SubSonic 3,但在 SubSonic 2 中,如果您运行此代码,内部查询将首先执行,第二个查询会将 CategoryIds 全部定义为查询中的参数。
      也许这是一个错误,您应该将其发布在 github 上。

      无论如何,您可以让您的查询暂时工作,并像 SubSonic 2 子查询一样,只需稍作改动:

      var q = new SubSonic.Query.Select().Top("1")
          .From("Order")
          .Where("ShopId")
          .IsEqualTo(shopId)
          .And(OrderTable.CustomerId).NotIn(
              new Subsonic.Query.Select("CustomerId")
                  .From("Customer")
                  .Where("TypeId")
                  .IsNotEqualTo(typeId)
                  .ExecuteTypedList<int>()
          )
          .OrderDesc("NewId()");
      

      NotIn 应该将 IEnumerable 作为参数,但在执行外部部分之前,q 将包含 CustomerIds 的整个列表作为参数。

      不是真正的解决方案,而是暂时的快速修复(如果它不会对性能产生太大影响的话)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 2013-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多