Получение дочерних записей в таблице SQL Server - PullRequest
5 голосов
/ 25 февраля 2010

Из-за моего отсутствия опыта работы с SQL Server и учитывая, что эта задача является обычной для приложений бизнес-направления, я хотел бы спросить, возможно, существует стандартный, общий способ выполнения следующей операции с базой данных:

Предположим, у нас есть две таблицы, связанные друг с другом отношением один-ко-многим, например SalesOderHeader и SalesOrderLines

http://s43.radikal.ru/i100/1002/1d/c664780e92d5.jpg

Поле SalesHeaderNo представляет собой PK в таблице SalesOderHeader и FK в таблице SalesOrderLines.

В клиентском приложении пользователь выбирает некоторое количество записей в таблице SalesOderHeader, используя, например, диапазон дат или поле IsSelected, установив флажки в полях GridView. Затем пользователь выполняет некоторые операции (пусть это будет просто «переход к другой таблице») с выбранным диапазоном заказов клиента.

Мой вопрос:

Как в этом случае я могу получить доступ к дочерним записям в таблице SalesOrderLines для выполнения тех же операций (в нашем случае «перейти к другой таблице») над этими дочерними записями так же просто, правильно, быстро и элегантный способ как можно?

Ответы [ 3 ]

2 голосов
/ 25 февраля 2010

Если вы в порядке с решением на основе T-SQL (в отличие от C # / LINQ) - вы можете сделать что-то вроде этого:

-- define a table to hold the primary keys of the selected master rows
DECLARE @MasterIDs TABLE (HeaderNo INT)

-- fill that table somehow, e.g. by passing in values from a C# apps or something

INSERT INTO dbo.NewTable(LineCodeNo, Item, Quantity, Price)
   SELECT SalesLineCodeNo, Item, Quantity, Price 
   FROM dbo.SalesOrderLine sol
   INNER JOIN @MasterIDs m ON m.HeaderNo = sol.SalesHeaderNo

При этом вы можете вставить весь набор строк из вашей дочерней таблицы в новую таблицу на основе критериев выбора.

1 голос
/ 25 февраля 2010

Ваш вопрос все еще немного расплывчат для меня, поскольку я не совсем уверен, что повлечет за собой "переход к другому столу". Означает ли это, что есть другая таблица с точной схемой обеих ваших таблиц образцов?

Однако, вот вам решение. Когда пользователь фиксирует запись SalesOrderHeader, выполняется некоторая операция, которая выглядит следующим образом:

Update SalesOrderHeader
Set....
Where SalesOrderHeaderNo = @SalesOrderHeaderNo

Or

Insert SomeOtherTable
Select ...
From SalesOrderHeader 
Where SalesOrderHeaderNo = @SalesOrderHeaderNo

В этой же операции есть причина, по которой вы не можете также что-то сделать с такими позициями, как:

Insert SomeOtherTableItems
Select ...
From SalesOrderLineItems
Where SalesOrderHeaderNo = @SalesOrderHeaderNo
1 голос
/ 25 февраля 2010

Я не знаю о "Best Practices", но вот что я использую:

 var header = db.SalesOrderHeaders.SingleOrDefault(h => h.SaleHeaderNo == 14);
 IEnumerable<SalesOrderLine> list = header.SalesOrderLines.AsEnumerable();

 // now your list contains the "many" records for the header
 foreach (SalesOrderLine line in list)
 {  
      // some code
 }

Я пытался смоделировать его после оформления вашего стола, но названия могут немного отличаться.

Теперь, не знаю, является ли это способом «наилучшей практики»,

РЕДАКТИРОВАНИЕ: Заметил, что вы хотите обновить их все, возможно, перейти к другой таблице. Поскольку LINQ-To-SQL не может выполнять массовые вставки / обновления, вы, вероятно, захотите использовать для этого T-SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...