我有以下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。但是,在两个Select嵌套的情况下,我希望输出有两个参数,名为@0和@1。
我的查询是基于Rob在他的博客中提供的一作为"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();还有其他人见过这种行为吗?这是个错误,还是我的错?由于我是亚音速的新手,我猜想这可能是程序员的错误,但如果可能的话,我想确认一下。
发布于 2012-01-30 19:14:15
刚刚在最新的版本中遇到了同样的问题,所以显然它还没有被修复。我试着改变条件的顺序(把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()");发布于 2010-06-09 17:34:43
我不确定SubSonic 3,但是在SubSonic 2中,如果要运行这段代码,将首先执行内部查询,第二个查询将把CategoryIds定义为查询中的一个参数。
也许这是个bug,你应该把它放在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作为参数的列表。
这不是一个真正的解决方案,而是暂时的快速修复(如果它对性能影响不大的话)。
https://stackoverflow.com/questions/2995268
复制相似问题