2009-04-19 6 views
2

Comment puis-je construire une requête dans subsonique de ce formatSubsonic requête (conditionA OU conditionB) ET ConditionC

(conditionA OU conditionB) ET ConditionC

Iv essayé différentes approches, mais je Je n'arrive pas à obtenir le résultat souhaité.

Voici une chose que je fatigué:

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

Répondre

2

J'utilise Subsonic 2.2, j'ai essayé quelques variations sur l'exemple de Rob, mais continué à obtenir une exception avec le message: « Il faut avoir au moins un de table spécifiée »

En fin de cette atteint le résultat voulu:

  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

Si je ne me trompe pas, c'est une Subsonic « caractéristique » avec OR.

Refactoriser votre requête comme

(ConditionA AND ConditionC) OR (ConditionB AND ConditionC) 

Dans ce cas, votre requête Subsonic comme

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

Edit:

Trouver quelque chose interresing here. L'idée principale est d'utiliser le

CloseExpression() 

.

7

Si vous utilisez 2.2 (ou 2.1), vous pouvez ouvrir les expressions:

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>(); 

Vous pouvez lire un peu plus ici: http://blog.wekeroad.com/subsonic/subsonic-version-21-pakala-preview-the-new-query-tool/

+0

Ai-je raison de dire que cela ne répond pas spécifiquement au problème? C'est plus de sucre syntaxique? – Dan

+1

La question - je pense - est sur la façon d'envelopper parens pour une expression - c'est un exemple de requête sur la façon de le faire. –

+0

Arr! Spot sur, merci rob – Dan

0

Si vous utilisez déjà SubSonic3, avec une requête LINQ cela est assez facile:

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

avec l'outil de requête (comme mentionné par d'autres) OrExpression/CloseExpression est la bonne façon de générer la bonne requête pour votre.

Questions connexes