2009-04-19 85 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是产生正确的查询的正确方法你的。