Subsonic 使用OR语句查询数据库的最佳方法
我正在尝试将以下sql脚本创建到可用于集合的亚音速查询中: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
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>();