2009-05-22 5 views
0

J'attemping pour créer le script SQL suivant dans une requête subsonique que je peux utiliser avec une collection:La meilleure façon d'interroger une base de données en utilisant une instruction OU

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

Voici mon code actuel:

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 (requête));

Le problème que je crois rencontrer est celui de l'évaluation des dates et de l'instruction OR. Je l'ai essayé avec juste le InvoiceID et VersionID et je reçois des données à la collection.

Toute aide sera grandement appréciée.

+0

Qu'est-ce qui ne va pas, s'il vous plaît? – gbn

Répondre

0

Vous SQL affiche un opérateur "inférieur ou égal à" (< =), mais vous codez indique GreaterThanOrEqualTo(). L'inversion de la logique pourrait-elle causer votre problème?

0

Désolé la syntaxe correcte pour la requête SQL aurait dû être:

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

et le code aurait dû être:

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 (requête);

Désolé pour la confusion

0

Wild guess:

« SubSonic.Comparision.Is, null » est pas le mappage à « IS NULL », c'est plutôt à la cartographie « = NULL »

1

En supposant que vous utilisez SubSonic 2.1 ou au-dessus, vous pouvez écrire cette requête comme:

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

le AndExpression causera la contrainte ou après l'imbrication

0

Adam a exactement - la chose vous manque est la partie de l'expression de ce qui est donné avec AndExpression

0

Après un peu de débogage j'ai pu terminer la requête avec les éléments suivants:

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

Merci à tous pour votre aide.

Questions connexes