2009-05-22 10 views
0

Ich attemping den folgenden SQL-Skript in eine Unterschall Abfrage abzufragen, um zu erstellen, die mich mit einer Sammlung verwenden:bester Weg, um eine Datenbank mit einer OR-Anweisung

Select * from tableA 
where tableA.InvoiceID = @Invoice 
and tableA.VersionID = @VersionID 
and tableA.ActiveDate >= GetDate() 
and (tableB.InActiveDate is null or tableB.InActiveDate <= GetDate()) 

Hier ist mein aktueller Code:

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); 

query.CommandTimeOut = intSubSonicTimeOut; partXrefColl.Load (FilePartXref.FetchByQuery (Abfrage));

Das Problem, in das ich glaube, dass ich hineinkomme, ist, dass die Daten und die OR-Aussage ausgewertet werden. Ich habe es nur mit der InvoiceID und der VersionID versucht und ich bekomme Daten zurück in die Sammlung.

Jede Hilfe wird sehr geschätzt.

+0

Was läuft bitte falsch? – gbn

Antwort

0

Sie SQL zeigt einen "kleiner als oder gleich" -Operator (< =), aber Sie Code sagt GreaterThanOrEqualTo(). Könnte die Umkehrung der Logik Ihr Problem verursachen?

0

Leider die korrekte Syntax für die SQL-Abfrage haben sollte:

Select * from tableA 
where tableA.InvoiceID = @Invoice 
and tableA.VersionID = @VersionID 
and tableA.ActiveDate <= GetDate() 
and (tableB.InActiveDate is null or tableB.InActiveDate >= GetDate()) 

und der Code sollte gewesen sein:

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); 

orders.Load (Invoices.FetchByQuery (query);

Entschuldigung für die Verwirrung

0

Wilde Rate:

"SubSonic.Comparision.Is, null" ist die Abbildung nicht auf "IS NULL", statt mapping "NULL =" es ist zu

1

Angenommen, Sie SubSonic 2.1 oder höher Sie verwenden wie die Abfrage schreiben:

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>(); 

die AndExpression wird die Oder-Einschränkung verursachen, nachdem es

0

Adam es genau hat verschachtelt werden - das, was Sie fehlt sind ist der Ausdruck ein Teil davon, die mit AndExpression gegeben

0

Nach einem kleinen Debuggen konnte ich die Abfrage mit der folgenden ausführen:

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>(); 

Vielen Dank an alle für all Ihre Unterstützung.

Verwandte Themen