Лучший способ сделать запрос к базе данных, используя оператор OR - PullRequest
0 голосов
/ 22 мая 2009

Я пытаюсь создать следующий 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);

query.CommandTimeOut = intSubSonicTimeOut; partXrefColl.Load (FilePartXref.FetchByQuery (запрос));

Проблема, с которой, как мне кажется, я сталкиваюсь, заключается в том, что вычисление даты и утверждение ИЛИ. Я попробовал это только с InvoiceID и VersionID, и я возвращаю данные в коллекцию.

Любая помощь будет принята с благодарностью.

Ответы [ 6 ]

0 голосов
/ 26 мая 2009

После небольшой отладки я смог выполнить запрос следующим образом:

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

Спасибо всем за помощь.

0 голосов
/ 22 мая 2009

У Адама это точно: вам не хватает части выражения, которая предоставляется AndExpression

0 голосов
/ 22 мая 2009

Если вы используете 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>();

Выражение AndEx вызовет ограничение Or после того, как оно будет вложено

0 голосов
/ 22 мая 2009

Дикая догадка:

«SubSonic.Comparision.Is, null» не сопоставляется с «IS NULL», а сопоставляется с «= NULL»

0 голосов
/ 22 мая 2009

Извините, правильный синтаксис для запроса 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);

orders.Load (Invoices.FetchByQuery (запрос);

Извините за путаницу.

0 голосов
/ 22 мая 2009

Ваш SQL показывает оператор «меньше или равно» (<=), но ваш код говорит GreaterThanOrEqualTo () Может ли изменение логики вызвать вашу проблему? </p>

...