Из моего отсутствия опыта SQL Server и принимая во внимание, что этой задачей является обычная для приложений Направления деятельности, я хотел бы спросить, возможно, существует стандарт, распространенный способ сделать следующую операцию базы данных:
Предположите, что у нас есть две таблицы, соединенные друг с другом связью "один ко многим", например SalesOderHeader
и SalesOrderLines
http://s43.radikal.ru/i100/1002/1d/c664780e92d5.jpg
Поле SalesHeaderNo
PK в SalesOderHeader
таблица и FK в SalesOrderLines
таблица.
В приложении фронтенда Пользователь выбирает некоторое количество записей в SalesOderHeader
таблица, с помощью, например, Диапазон дат, или IsSelected
поле путем нажатия на поля флажка в GridView. Затем Пользователь выполняет, некоторые операции (позвольте, это быть просто "перемещается в другую таблицу") на выбранном диапазоне Заказов на покупку.
Мой вопрос:
Как в этом случае я могу достигнуть дочерних рекордных отметок в SalesOrderLines
таблица для выполнения тех же операций (в нашем случае "перемещаются в другую таблицу") по этим дочерним записям максимально легким, корректным, быстрым и изящным способом?
Если вас устраивает решение на основе 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
С его помощью вы можете вставить целый набор строк из вашей дочерней таблицы в новую таблицу на основе критериев выбора.
Ваш вопрос все еще немного туманен для меня, поскольку я не совсем понимаю, что подразумевается под "переместить в другую таблицу". Означает ли это, что существует другая таблица с точной схемой обеих ваших таблиц-образцов?
Однако, вот попытка решения. Когда пользователь фиксирует запись SalesOrderHeader, будет выполнена некоторая операция, которая выглядит так:
Update SalesOrderHeader
Set....
Where SalesOrderHeaderNo = @SalesOrderHeaderNo
Or
Insert SomeOtherTable
Select ...
From SalesOrderHeader
Where SalesOrderHeaderNo = @SalesOrderHeaderNo
В этой же операции есть причина, по которой вы не можете также сделать что-то со строками, например:
Insert SomeOtherTableItems
Select ...
From SalesOrderLineItems
Where SalesOrderHeaderNo = @SalesOrderHeaderNo
Я не знаю о "лучшей практике", но вот что я использую:
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.