2010-06-08 3 views
2

나는 중첩 NotIn 쿼리가 들어있는 다음 음속 3.0 쿼리가 있습니다Subsonic 3 ActiveRecord는 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 @ 것을 알 수 있습니다를. 각 매개 변수가 열거 된 (0에서 시작) 것으로 가정합니다. 각 "새"Select 쿼리. 그러나 두 개의 Select 쿼리가 중첩되어있는 경우에는 출력에 @ 0@ 1이라는 두 개의 매개 변수가 있어야합니다.

이 내 쿼리 롭 Conery 3. 그분의 모범 음속되었다 "Pakala"쿼리 도구의 미리보기로 자신의 블로그에 준 one에 기반을했다 :

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

다른 사람이 동작을 본 적이 있습니까? 버그입니까, 아니면 오류입니까 아니면 제 부분입니까? 나는 Subsonic에 익숙하지 않기 때문에 프로그래머가이 부분에서 실수를 범한 것 같지만 가능한 경우 확인을 원합니다.

답변

1

최신 릴리스에서 똑같은 문제가 발생 했으므로 아직 수정되지 않은 것 같습니다. 나는 조건의 순서를 바꾸려고 시도했다. (NotIn 조건을 먼저 넣는다.) 그리고 그 트릭을했다. 다음은 새 코드의 모양입니다. @ 0과 @ 0 대신 @ 0 및 @ 1 매개 변수가 생성되었습니다.

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

SubSonic 3에 대해 잘 모르겠지만 SubSonic 2에서이 코드를 실행하면 내부 쿼리가 먼저 실행되고 두 번째 쿼리는 이미 쿼리의 매개 변수로 정의 된 CategoryIds를 갖게됩니다.
아마도 버그이며 github에 게시해야합니다.

어쨌든 당신은 잠시 동안 쿼리 작업을하고이 작은 변화와 음속이 하위 쿼리처럼 행동 수 :

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의 전체 목록이 포함됩니다 외부 파트가 실행되기 전에 매개 변수로 사용됩니다.

실제 해결책이 아니라 순간적인 빠른 수정 (성능에 많은 영향을 미치지 않는 경우).