3

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

(条件 A 或条件 B)与条件 C

我尝试了各种方法,但我似乎无法得到想要的结果。

这是我累的一件事:

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

4 回答 4

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/

于 2009-04-19T20:56:44.433 回答
2

如果我没记错的话,这是带有 OR 的 Subsonic “功能”。

将您的查询重构为

(ConditionA AND ConditionC) OR (ConditionB AND ConditionC)

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

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

编辑:

在这里找到一些有趣的东西。主要思想是使用

CloseExpression()

标签。

于 2009-04-19T19:22:23.457 回答
2

我正在使用 Subsonic 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>();
于 2009-04-21T20:33:55.983 回答
0

如果您已经使用 SubSonic3,使用 linq 查询,这很容易:

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

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

于 2010-12-03T14:47:02.833 回答