Дозвуковой 2.1: Я сумасшедший? - PullRequest
0 голосов
/ 13 февраля 2010

Я работаю над проектом с использованием Subsonic 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, фильтр CategoryID не работает. Без проблем он достигает точки останова, но не фильтруется. Это как-то связано с запросом LIKE? Это прекрасно работает, если я удаляю часть if и текущий s.where и изменяю запрос так:

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

Я что-то здесь упускаю?

С уважением, Mark

Ответы [ 2 ]

2 голосов
/ 15 февраля 2010

Похоже, что вы запрашиваете:

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 = ...

Вы можете получить скобки в дозвуковой версии 2.1 с помощью синтаксиса AndExpression / OrExpression, следующего за CloseExpression.

0 голосов
/ 15 февраля 2010

Прошло много времени с тех пор, как я использовал 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>();
...