亚音速查询(ConditionA OR ConditionB)和ConditionC

如何在Subsonic中构建此格式的查询

(ConditionA OR ConditionB)AND 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.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(); 

你可以在这里阅读更多内容: http : //blog.wekeroad.com/subsonic/subsonic-version-21-pakala-preview-the-new-query-tool/

如果我没错,这是带有OR的亚音速“function”。

将您的查询重构为

 (ConditionA AND ConditionC) OR (ConditionB AND ConditionC) 

在这种情况下,您的Subsonic查询就像

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

编辑:

在这里找一些有趣的事情。 主要的想法是使用

 CloseExpression() 

标签。

我正在使用Subsonic 2.2,我在Rob的例子中尝试了一些变体,但是仍然得到一条例外消息:“需要至少有一个From表指定”

最终,这达到了预期的效果:

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

如果你已经使用了带有linq查询的SubSonic3,这很容易:

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

使用查询工具(如其他人所述)OrExpression / CloseExpression是为您生成正确查询的正确方法。