Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Subsonic 使用OR语句查询数据库的最佳方法_Subsonic - Fatal编程技术网

Subsonic 使用OR语句查询数据库的最佳方法

Subsonic 使用OR语句查询数据库的最佳方法,subsonic,Subsonic,我正在尝试将以下sql脚本创建到可用于集合的亚音速查询中: Select * from tableA where tableA.InvoiceID = @Invoice and tableA.VersionID = @VersionID and tableA.ActiveDate >= GetDate() and (tableB.InActiveDate is null or tableB.InActiveDate <= GetDate()) query.CommandTimeOu

我正在尝试将以下sql脚本创建到可用于集合的亚音速查询中:

Select * from tableA
where tableA.InvoiceID = @Invoice
and tableA.VersionID = @VersionID
and tableA.ActiveDate >= GetDate()
and (tableB.InActiveDate is null or tableB.InActiveDate <= GetDate())
query.CommandTimeOut=intTimeout; partXrefColl.Load(FilePartXref.FetchByQuery(query))

我认为我遇到的问题是对日期和OR声明的回避。我只使用InvoiceID和VersionID进行了尝试,并将数据返回到集合中


非常感谢您的帮助。

您的SQL显示了一个“小于或等于”运算符(对不起,SQL查询的正确语法应该是:

Select * from tableA
where tableA.InvoiceID = @Invoice
and tableA.VersionID = @VersionID
and tableA.ActiveDate <= GetDate()
and (tableB.InActiveDate is null or tableB.InActiveDate >= GetDate())
orders = new OrdersCollection();
query = new SubSonic.Query(Tables.Orders);
query.WHERE("InvoiceID", Invoice.InvoiceID);
query.AND("VersionID", version.VersionID);
query.AND("ActiveDate", SubSonic.Is.LessThanOrEqualTo(System.DateTime.Now.ToString()).Value);
query.AND("InActiveDate", SubSonic.Comparision.Is, null).OR("InActiveDate", SubSonic.Is.GreaterThanOrEqualTo("System.DateTime.Now.ToString()).Value);
订单.Load(发票).FetchByQuery(查询)

抱歉给您带来困惑。

胡乱猜测:


“SubSonic.comparison.Is,null”不是映射到“Is null”,而是映射到“=null”

假设您使用的是SubSonic 2.1或更高版本,则可以将该查询编写为:

OrdersCollection orders = DB.Select.From(Orders.Schema)
  .Where(Orders.Columns.InvoiceID).IsEqualTo(1)
  .And(Orders.Columns.VersionID).IsEqualTo(1)
  .And(Orders.Columns.ActiveDate).IsLessThanOrEqualTo(DateTime.Now)
  .AndExpression(Orders.Columns.InActiveDate).IsNull()
  .Or(Orders.Columns.InActiveDate).IsGreaterThanOrEqualTo(DateTime.Now)
  .ExecuteAsCollection<OrdersCollection>();
OrdersCollection orders=DB.Select.From(orders.Schema)
.Where(Orders.Columns.InvoiceID).IsEqualTo(1)
.和(Orders.Columns.VersionID).IsEqualTo(1)
.And(Orders.Columns.ActiveDate).IsLessThanOrEqualTo(DateTime.Now)
.AndExpression(Orders.Columns.InActiveDate).IsNull()
.Or(Orders.Columns.InActiveDate).大于或等于(DateTime.Now)
.ExecuteAsCollection();

AndExpression将使其后面的Or约束嵌套

Adam完全拥有它-您缺少的是它的表达式部分,它由AndExpression提供

经过一点调试后,我能够用以下内容完成查询:

 OrderColl =  DB.Select().From(Orders.Schema)
                    .Where(Orders.Columns.VersionID).IsEqualTo(version.VersionID)
                    .And(Orders.Columns.FulfillNumber).IsEqualTo(invoice.InvocieID)
                    .And(Orders.Columns.ActiveDate).IsLessThanOrEqualTo(DateTime.Now)
                    .AndExpression(Orders.Columns.InactiveDate).IsNull()
                    .Or("InActiveDate").IsGreaterThanOrEqualTo(DateTime.Now)
                    .ExecuteAsCollection<OrdersCollection>();  
OrderColl=DB.Select().From(Orders.Schema)
.Where(Orders.Columns.VersionID).IsEqualTo(version.VersionID)
.和(订单.列.完成编号).IsEqualTo(发票.发票ID)
.And(Orders.Columns.ActiveDate).IsLessThanOrEqualTo(DateTime.Now)
.AndExpression(Orders.Columns.InactiveDate).IsNull()
.或(“不活动日期”)。大于或等于(DateTime.Now)
.ExecuteAsCollection();
谢谢大家的帮助

 OrderColl =  DB.Select().From(Orders.Schema)
                    .Where(Orders.Columns.VersionID).IsEqualTo(version.VersionID)
                    .And(Orders.Columns.FulfillNumber).IsEqualTo(invoice.InvocieID)
                    .And(Orders.Columns.ActiveDate).IsLessThanOrEqualTo(DateTime.Now)
                    .AndExpression(Orders.Columns.InactiveDate).IsNull()
                    .Or("InActiveDate").IsGreaterThanOrEqualTo(DateTime.Now)
                    .ExecuteAsCollection<OrdersCollection>();