Subsonic 3 ActiveRecord嵌套选择NotIn bug?

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

public List 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(); } 

内部查询似乎不正确:

 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在他的博客上作为“Pakala”查询工具的预览,该工具成为了Subsonic 3.他的例子是:

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

有没有人见过这种行为? 这是一个错误,或者这是一个错误还是我的一部分? 因为我是Subsonic的新手,所以我猜这可能是程序员错误,但我希望尽可能确认。

刚刚在最新版本中遇到了同样的问题,显然它尚未修复。 我尝试切换条件的顺序(将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()"); 

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

无论如何,你可以让你的查询暂时工作,并表现得像SubSonic 2 Subquery这个小小的变化:

 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() ) .OrderDesc("NewId()"); 

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

不是一个真正的解决方案,而是目前的快速解决方案(如果它不会影响性能)。

    Interesting Posts