首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >亚音速3 ActiveRecord嵌套选择为NotIn错误?

亚音速3 ActiveRecord嵌套选择为NotIn错误?
EN

Stack Overflow用户
提问于 2010-06-08 06:48:04
回答 2查看 704关注 0票数 2

我有以下Subsonic 3.0查询,它包含嵌套的NotIn查询:

代码语言:javascript
复制
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>();
}

内部查询似乎不正确:

代码语言:javascript
复制
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。但是,在两个Select嵌套的情况下,我希望输出有两个参数,名为@0@1

我的查询是基于Rob在他的博客中提供的作为"Pakala“查询工具的预览,这个工具后来变成了Subsonic 3。他的例子是:

代码语言:javascript
复制
int records = new Select(Northwind.Product.Schema)
    .Where("productid")
    .In(
        new Select("productid").From(Northwind.Product.Schema)
        .Where("categoryid").IsEqualTo(5)
        )
    .GetRecordCount();

还有其他人见过这种行为吗?这是个错误,还是我的错?由于我是亚音速的新手,我猜想这可能是程序员的错误,但如果可能的话,我想确认一下。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-30 19:14:15

刚刚在最新的版本中遇到了同样的问题,所以显然它还没有被修复。我试着改变条件的顺序(把NotIn条件放在第一位),这就成功了。下面是新代码的样子,它生成参数@0和@1,而不是@0和@0:

代码语言:javascript
复制
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()");
票数 1
EN

Stack Overflow用户

发布于 2010-06-09 17:34:43

我不确定SubSonic 3,但是在SubSonic 2中,如果要运行这段代码,将首先执行内部查询,第二个查询将把CategoryIds定义为查询中的一个参数。

也许这是个bug,你应该把它放在github上。

无论如何,您可以暂时使您的查询正常工作,并通过这个小小的更改来表现得像一个SubSonic 2子查询:

代码语言:javascript
复制
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作为参数的列表。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2995268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档