如何在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);
答案 0 :(得分: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/
答案 1 :(得分:2)
如果我没错,这是带有OR的亚音速“功能”。
将您的查询重构为
(ConditionA AND ConditionC) OR (ConditionB AND ConditionC)
在这种情况下,您的Subsonic查询就像
一样q.WHERE(...).AND(...).OR(...).AND(...)
修改强>
找一些有用的东西here。主要思想是使用
CloseExpression()
标签
答案 2 :(得分:2)
我正在使用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<Challenge>();
答案 3 :(得分:0)
如果你已经使用了带有linq查询的SubSonic3,这很容易:
var result = from c in db.Challenges
where (c.ChallengeeKey == playerKey || c.ChallengerKey == playerKey)
&& c.Complete == false
select c;
使用查询工具(如其他人所述)OrExpression / CloseExpression是为您生成正确查询的正确方法。