【问题标题】:subsonic query problem亚音速查询问题
【发布时间】:2009-08-14 12:33:23
【问题描述】:

我在应用中使用 subsonic 2.2。我正在运行一个有点复杂的查询,因为我对一个字段同时使用了“And”和“Or”,我对如何将它转换为 sql 语句有点困惑

MytableCollection col = DB.Select().From("mytable").Where("prop1").IsEqualTo(obj.prop1)
                .And("prop2").IsEqualTo(obj.prop2)
                .And("prop3").IsEqualTo(obj.prop3)
                .Or("prop1").IsEqualTo(1)                
                .ExecuteAsCollection<MytableCollection>();

我想执行这样的查询。

select * from mytable where (prop1=obj.prop1 or prop1=1)  and prop2=obj.prop2 and prop23=obj.prop3

【问题讨论】:

    标签: subsonic


    【解决方案1】:

    正如 Andra 所说,您可以使用 AndExpression。这应该做你想做的事:

    MytableCollection col = DB.Select().From(Mytable.Schema)
      .Where(Mytable.Columns.Prop2).IsEqualTo(obj.prop2)
      .And(Mytable.Columns.Prop3).IsEqualTo(obj.prop3)
      .AndExpression(Mytable.Columns.Prop1).IsEqualTo(obj.prop1)
      .Or(Mytable.Columns.Prop1).IsEqualTo(1)                
      .ExecuteAsCollection<MytableCollection>();
    

    注意如果重命名表,使用 MyTable.Schema 和 MyTable.Columns 会在编译时发现很多问题,并且会保存由错误输入引起的错误

    【讨论】:

      【解决方案2】:

      真正有用的还有以下两种在查询构建中调用的方法:

      .OpenExpression()
      

      .CloseExpression()
      

      混合使用那些糟糕的浮标,您可以更好地控制事情的开始和结束

      【讨论】:

        【解决方案3】:

        您可以在亚音速 2.2 中使用表达式。

        MytableCollection col  = new Select(Mytable.Schema)
        .WhereExpression("prop1").IsEqualTo(obj.prop1).Or("prop1").IsEqualTo(1)
        .AndExpression("prop2").IsEqualTo(obj.prop2)
        .AndExpression("prop3").IsEqualTo(obj.prop3)
        .ExecuteAsCollection<MytableCollection>();
        

        【讨论】:

        • 由于查询只有一组括号,你应该只需要一个 AndExpression
        • 会这样。 select * from mytable where (prop1=obj.prop1 or prop1=1) and (prop2=obj.prop2) and (prop23=obj.prop3)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多