2010-02-13 56 views
0

我正在使用亞音速2.1的項目工作。對於一個簡單的搜索查詢我下面的代碼:亞音速2.1:我瘋了嗎?

  DAL.ItemCollection coll = new DAL.ItemCollection(); 
     SubSonic.Select s = new SubSonic.Select(); 
     s.From(DAL.Item.Schema); 
     s.Where("Title").Like("%" + q + "%").Or("Tags").Like("%" + q + "%").And("IsActive").IsEqualTo(true); 

     if (fid > 0) 
     { 
      s.And("CategoryID").IsEqualTo(fid); 
      Session["TotalSearchResults"] = null; 
     } 
     s.Top(maxitems); 

     //We'll get the recordcount before paged results 
     total = s.GetRecordCount(); 

     s.Paged(pageindex, pagesize); 
     s.OrderDesc("Hits"); 
     s.OrderDesc("Points"); 
     s.OrderDesc("NumberOfVotes"); 
     coll = s.ExecuteAsCollection<DAL.ItemCollection>(); 

現在的問題是,當我的FID(FilterId)越大則0時,類別ID過濾器不起作用。它擊中斷點沒有問題,但它沒有被過濾。它與LIKE查詢有關嗎?它完美的作品,如果我刪除if部分和當前s.where和更改查詢做到這一點:

s.Where("CategoryID").IsEqualTo(fid); 

我懷念這裏的東西很重要?

親切的問候, 馬克

+0

嘗試打印s.ToString()並查看獲取輸出的SQL。 – sparks 2010-02-15 04:03:27

回答

0

這已經有一段時間,因爲我用2.1,但我希望以下工作:

DAL.ItemCollection coll = new DAL.ItemCollection(); 
    SubSonic.Select s = new SubSonic.Select(); 
    s.From(DAL.Item.Schema) 
     .Where("Title").Like("%" + q + "%") 
     .Or("Tags").Like("%" + q + "%") 
     .And("IsActive").IsEqualTo(true); 

    if (fid > 0) 
    { 
     s = s.And("CategoryID").IsEqualTo(fid); 
     Session["TotalSearchResults"] = null; 
    } 
    s = s.Top(maxitems); 

    //We'll get the recordcount before paged results 
    total = s.GetRecordCount(); 

    s = s.Paged(pageindex, pagesize); 
     .OrderDesc("Hits"); 
     .OrderDesc("Points"); 
     .OrderDesc("NumberOfVotes"); 
    coll = s.ExecuteAsCollection<DAL.ItemCollection>(); 
2

它看起來像您要查詢:

SELECT * FROM Schema 
WHERE title LIKE ... 
    OR tags LIKE ... 
    AND isactive = true 
    AND categoryid = ... 

但你想要的是:

SELECT * FROM Schema 
WHERE (title LIKE ... OR tags LIKE ...) 
    AND isactive = true 
    AND categoryid = ... 

您可以使用CloseExpression後面的AndExpression/OrExpression語法獲取subsonic 2.1中的括號。