2010-02-24 8 views
5

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

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

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

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

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

Мой вопрос:

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

+0

Кто достигнет наших детей? –

+0

У вас есть «linq-to-sql» в ваших тегах - вам нужно решение C#/LINQ, или вы ищете решение на основе T-SQL (на основе SQL Server)? –

+0

@marc_s Я использую LINQ to SQL в своем приложении, но я не уверен, что этот инструмент подходит для такой задачи.Если да, я буду использовать LINQ. Но, возможно, с T-SQL это можно сделать более стандартным и простым способом. Поэтому мне просто нужны ваши советы и помощь. Благодаря! – rem

ответ

2

Если вы хорошо с раствором на основе 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 

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

+0

Я сделал так, как вы предлагали, и это работает как шарм. Этот трюк с дополнительным столом для ПК и InnerJoin - это то, что я искал. Очень простой, эффективный и элегантный способ. Большое вам спасибо! – rem

1

Я не знаю, о «лучшей практики», но это то, что я использую:

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 
} 

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

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

EDITED: Заметил, что вы хотите обновить их все, возможно, переместитесь на другую таблицу. Поскольку LINQ-To-SQL не может выполнять массовые вставки/обновления, вы, вероятно, захотите использовать T-SQL для этого.

+0

Спасибо за пример кода! Это будет полезно для меня + 1 – rem

1

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

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

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

Or 

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

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

Insert SomeOtherTableItems 
Select ... 
From SalesOrderLineItems 
Where SalesOrderHeaderNo = @SalesOrderHeaderNo