Linq to SQl, выберите один и тот же столбец из нескольких таблиц - PullRequest
2 голосов
/ 27 января 2009

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

В основном у меня есть таблица для каждого типа аппаратного компонента на компьютере, и у каждой таблицы есть столбец ItemNumber. Мне нужно запросить все таблицы за один раз, и вернуть значения ItemNumber в плоский список / массив. (По сути, я хочу быть в состоянии сделать ниже)

foreach (var c in items) {
                Console.WriteLine(c.ItemNumber);
            }

Поиск в сети безрезультатен, может кто-нибудь показать мне пример того, как это сделать? Моя лучшая попытка в этом заключается в следующем, но я недостаточно понимаю Sql для этого.

var items = from hc in dc.DataBoxPCHardwareCases
                         from hhd in dc.DataBoxPCHardwareHardDrives
                         from hkb in dc.DataBoxPCHardwareKeyboards
                         from hmm in dc.DataBoxPCHardwareMemories
                         from hmo in dc.DataBoxPCHardwareMonitors
                         from hmb in dc.DataBoxPCHardwareMotherboards
                         from hms in dc.DataBoxPCHardwareMouses
                         from hod in dc.DataBoxPCHardwareOpticalDrives
                         from hps in dc.DataBoxPCHardwarePowerSupplies
                         from hpc in dc.DataBoxPCHardwareProcessors
                         from hsp in dc.DataBoxPCHardwareSpeakers
                         from hvc in dc.DataBoxPCHardwareVideoCards
                         from sos in dc.DataBoxPCSoftwareOperatingSystems
                         select new { hc, hhd, hkb, hmm, hmo, hmb, hms, hod, hps, hpc, hsp, hvc, sos };

Ответы [ 3 ]

5 голосов
/ 27 января 2009

Не используйте Union - вместо этого используйте Concat !

  • Объединение LinqToSql сопоставлено с Объединением .
  • LinqToSql's Concat сопоставлен с T-Sql's Union All .

Разница в том, что Union требует, чтобы списки сверялись друг с другом и удалялись дубликаты. Эта проверка стоит времени, и я ожидаю, что ваши номера деталей являются глобально уникальными (в любом случае отображаются только в одном списке). Union All пропускает эту дополнительную проверку и удаление дубликатов.

List<string> itemNumbers =
  dc.DataBoxPCHardwareCases.Select(hc => hc.ItemNumber)
  .Concat(dc.DataBoxPCHardwareHardDrives.Select( hkd => hkd.ItemNumber ))
  .Concat(dc.DataBoxPCHardwareKeyboards.Select( hkb => hkb.ItemNumber ))
  .Concat(dc.DataBoxPCHardwareMemories.Select( hhh => hhh.ItemNumber ))
  .Concat(dc.DataBoxPCHardwareMonitors.Select( hmo => hmo.ItemNumber ))
  .Concat(dc.DataBoxPCHardwareMotherboards.Select( hmb => hmb.ItemNumber ))
  .Concat(dc.DataBoxPCHardwareMouses.Select( hms => hms.ItemNumber ))
  .Concat(dc.DataBoxPCHardwareOpticalDrives.Select( hod => hod.ItemNumber ))
  .Concat(dc.DataBoxPCHardwarePowerSupplies.Select( hps => hps.ItemNumber ))
  .Concat(dc.DataBoxPCHardwareProcessors.Select( hpc => hpc.ItemNumber ))
  .Concat(dc.DataBoxPCHardwareSpeakers.Select( hsp => hsp.ItemNumber ))
  .Concat(dc.DataBoxPCHardwareVideoCards.Select( hvc => hvc.ItemNumber ))
  .Concat(dc.DataBoxPCSoftwareOperatingSystems.Select( sos => sos.ItemNumber ))
  .ToList();
5 голосов
/ 27 января 2009

То, что вы описываете, является союзом:

ВЫБРАТЬ ItemNumber ОТ tbl1 СОЮЗ ВЫБРАТЬ ItemNumber ОТ tbl2

В LINQ:

var itemCounts = (from hhd in dc.HHD select hhd.ItemNumber)
                 .Union((from hkb in dc.HKB select hkb.ItemNumber)
                         .Union(from hmm in dc.HMM select hmm.ItemNumber)) 
                 and so on

Обратите внимание, что использование таких UNION не очень эффективно. Вы получаете весь набор данных за одну поездку в базу данных, но сервер базы данных должен выполнить отдельный запрос для каждого UNION, поэтому, если вы планируете делать что-то сложное с большим количеством данных, вам лучше переосмыслить дизайн вашей базы данных.

1 голос
/ 27 января 2009

Союз См. здесь

var items = (from hc in dc.DataBoxPCHardwareCases select hc.ItemNumber).Union
            (from hhd in dc.DataBoxPCHardwareHardDrives select hkd.ItemNumber).Union
            (from hkb in dc.DataBoxPCHardwareKeyboards select hkb.ItemNumber).Union
            (from hmm in dc.DataBoxPCHardwareMemories select hhh.ItemNumber).Union
            (from hmo in dc.DataBoxPCHardwareMonitors select hmo.ItemNumber).Union
            (from hmb in dc.DataBoxPCHardwareMotherboards select hmb.ItemNumber).Union
            (from hms in dc.DataBoxPCHardwareMouses select hms.ItemNumber).Union
            (from hod in dc.DataBoxPCHardwareOpticalDrives select hod.ItemNumber).Union
            (from hps in dc.DataBoxPCHardwarePowerSupplies select hps.ItemNumber).Union
            (from hpc in dc.DataBoxPCHardwareProcessors select hpc.ItemNumber).Union
            (from hsp in dc.DataBoxPCHardwareSpeakers select hsp.ItemNumber).Union
            (from hvc in dc.DataBoxPCHardwareVideoCards select hvc.ItemNumber).Union
            (from sos in dc.DataBoxPCSoftwareOperatingSystems select sos.ItemNumber)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...