C# 亚音速查询(条件A或条件B)和条件C

C# 亚音速查询(条件A或条件B)和条件C,c#,subsonic,C#,Subsonic,如何以这种格式的亚音速构建查询 (条件A或条件B)和 条件性 我尝试了各种方法,但似乎没有达到预期的效果 有一件事我很累: Query q = Challenge.CreateQuery(); q.WHERE(Challenge.Columns.ChallengeeKey, playerKey) .OR(Challenge.Columns.ChallengerKey, playerKey); q.AND(Challenge.Columns.Complete,

如何以这种格式的亚音速构建查询

(条件A或条件B)和 条件性

我尝试了各种方法,但似乎没有达到预期的效果

有一件事我很累:

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

如果我没有错的话,这是一个亚音速的“特征”,带有或

根据需要重构查询

(ConditionA AND ConditionC) OR (ConditionB AND ConditionC)
在这种情况下,您的亚音速查询如下

q.WHERE(...).AND(...).OR(...).AND(...)
编辑:

找到一些相互关联的东西。主要思想是使用

CloseExpression()
标记。

如果使用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>();
Northwind.ProductCollection产品=新选择(Northwind.Product.Schema)
其中,表达式(“类别ID”)等于(5)和(“产品ID”)大于(10)
.oreexpression(“categoryID”).IsEqualTo(2)。和(“productID”)介于和(2,5)之间
.ExecuteAsCollection();
您可以在此处阅读更多内容:

我使用的是亚音速2.2,我尝试了Rob示例中的一些变体,但始终得到一个异常消息:“需要指定表中的至少一个”

最终达到了预期的效果:

          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>();
Challenge Challenge=new Select().From(Challenge.Schema)
.WhereExpression(Challenge.Columns.ChallengerKey).IsEqualTo(playerKey)
.Or(Challenge.Columns.ChallengerKey).IsGreater大于(playerKey)
.AndExpression(Challenge.Columns.Complete).IsEqualTo(false)
.ExecuteSingle();

如果您已经使用了SubSonic3,使用linq查询,这非常简单:

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

使用查询工具(如其他人所提到的)或Expression/CloseExpression是为您的应用程序生成正确查询的正确方法。

我说这并没有特别解决问题,对吗?这更像是语法上的甜点?我想,问题是如何将表达式包装在paren中-这是一个关于如何进行的示例查询。