Как вернуть как можно меньше строк из связанной таблицы - PullRequest
1 голос
/ 26 июля 2010

Я новичок в ADO.net, и у меня возникла эта проблема:

Предположим, у меня есть две таблицы в базе данных SQL Server 2005 со следующими столбцами:

[Заказы]

  • OrderID
  • OrderDate
  • ShopID
  • TotalAmount
  • TotalTaxAmount
  • и т. Д. *

[OrdersDetails]

  • OrderID
  • ShopID
  • ItemID
  • Количество
  • Сумма
  • TaxAmount
  • и т. Д.

Я запустил приложение WinForms, чтобы начать работу.В этой форме пользователь может выбрать список магазинов и диапазон дат, чтобы увидеть все заказы из этого магазина.

Я добавил источник данных из Visual Studio, выбрал таблицу Orders и OrdersDetails и перетащил иудалил таблицы Orders и связанные с ними OrdersDetails в форму как DataGridViews.

Когда я выбираю строку из DataGridView Orders, я действительно вижу соответствующие Детали Orders во втором DataGridView, как я хотел.У меня были связи внутри этой базы данных, и ADO.net перехватил их и отразил в наборе данных.

Затем я добавил метод в свой типизированный набор данных для получения данных по столбцам OrderDate и ShopID.Поскольку таблица OrdersDetails не имеет столбца OrderDate, я мог отфильтровать его только по ShopID.

Проблема заключается в том, что получение записей из OrdersDetails занимает много времени, так как в него будет извлечено больше строк, чем необходимоDataTable для OrdersDetails.Проблема в том, что я могу фильтровать только строки из таблицы OrderDetails по ShopID, который возвращает слишком много записей из базы данных.

Очевидно, ADO.net может соответствующим образом отфильтровать их на стороне клиента с помощьюиспользуя отношение OrderID, но было бы гораздо разумнее извлекать только те строки из OrdersDetails, которые мне действительно нужны.

Я изменил свои запросы, получая данные из второй таблицы, чтобы добавить OrderDate, используя соединение,так что я могу фильтровать по дате, когда я получаю данные из базы данных ... однако, это вызывает проблемы, когда я пытаюсь обновить свои изменения из-за этого внешнего столбца ...

Я считаю, что должно быть легкоспособ обойти это, не так ли?

Большое спасибо заранее.

Ответы [ 2 ]

2 голосов
/ 26 июля 2010

Вы хотите сделать что-то вроде этого

SELECT *
FROM OrderDetails
WHERE
    ShopID IN ( @listOfShopIds )
    AND
    OrderID IN (
        SELECT OrderID
        FROM Orders
        WHERE
            OrderDate BETWEEN @dateFrom AND @dateTo
    )
0 голосов
/ 26 июля 2010

@ Дэвид, вероятно, лучше написать код, который выражает ваше намерение и отражает более производительный алгоритм, чем полагаться на детали реализации механизма для выполнения оптимизации.

...