Дозвуковой запрос (УсловиеA ИЛИ УсловиеB) И УсловиеC - PullRequest
3 голосов
/ 19 апреля 2009

Как мне построить запрос в Subsonic для этого формата

(Условие A ИЛИ Условие B) И ConditionC

Iv пробовал разные подходы, но, похоже, я не могу получить желаемый результат.

Вот одна вещь, которую я устал:

Query q = Challenge.CreateQuery();
      q.WHERE(Challenge.Columns.ChallengeeKey, playerKey)
      .OR(Challenge.Columns.ChallengerKey, playerKey);
       q.AND(Challenge.Columns.Complete, false);

Ответы [ 4 ]

7 голосов
/ 20 апреля 2009

Если вы используете 2.2 (или 2.1), вы можете открыть выражения:

Northwind.ProductCollection products = new Select(Northwind.Product.Schema)
    .WhereExpression("categoryID").IsEqualTo(5).And("productid").IsGreaterThan(10)
    .OrExpression("categoryID").IsEqualTo(2).And("productID").IsBetweenAnd(2, 5)
    .ExecuteAsCollection<Northwind.ProductCollection>();

Вы можете прочитать немного больше здесь: http://blog.wekeroad.com/subsonic/subsonic-version-21-pakala-preview-the-new-query-tool/

2 голосов
/ 22 апреля 2009

Я использую Subsonic 2.2, я попробовал несколько вариантов на примере Роба, но продолжал получать исключение с сообщением: «Нужно указать хотя бы один из таблицы»

В итоге достиг желаемого результата:

          Challenge challenge = new Select().From(Challenge.Schema)
           .WhereExpression(Challenge.Columns.ChallengerKey).IsEqualTo(playerKey)
           .Or(Challenge.Columns.ChallengerKey).IsGreaterThan(playerKey)
           .AndExpression(Challenge.Columns.Complete).IsEqualTo(false)
           .ExecuteSingle<Challenge>();
2 голосов
/ 19 апреля 2009

Если я не ошибаюсь, это дозвуковая «функция» с ИЛИ.

Переформулируйте ваш запрос как

(ConditionA AND ConditionC) OR (ConditionB AND ConditionC)

В этом случае ваш дозвуковой запрос типа

q.WHERE(...).AND(...).OR(...).AND(...)

Edit:

Найдите здесь интересную вещь . Основная идея заключается в использовании

CloseExpression()

бирка.

0 голосов
/ 03 декабря 2010

Если вы уже используете SubSonic3, с запросом linq это довольно просто:

var result = from c in db.Challenges
             where (c.ChallengeeKey == playerKey || c.ChallengerKey == playerKey)
                 && c.Complete == false
             select c;

с помощью инструмента запросов (как упоминалось другими) OrExpression / CloseExpression - это правильный способ для создания правильного запроса для вашего.

...