2009-04-19 84 views
2

如何建立一個查詢在亞音速,這種格式的亞音速查詢(ConditionA OR ConditionB)和ConditionC

(ConditionA OR ConditionB)和 ConditionC

㈣想盡各種辦法,但我似乎不能得到理想的結果。

這裏有一件事我累了:

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

回答

2

我使用亞音速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

如果我沒看錯,這是一種亞音速的「功能」與OR。

重構您的查詢作爲

(ConditionA AND ConditionC) OR (ConditionB AND ConditionC) 

在這種情況下,您的亞音速查詢像

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

編輯:

尋找一些interresing事情here。主要思路是使用

CloseExpression() 

標籤。

7

如果你使用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/

+0

我是否正確地說這不具體解決問題?這是更多的語法糖? – Dan 2009-04-20 10:31:57

0

如果您已經使用SubSonic3,與LINQ查詢,這是很容易的:

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

與(如其他人所說)查詢工具OrExpression/CloseExpression是產生正確的查詢的正確方法你的。