2009-01-26 8 views
2

J'ai essayé de développer une requête linq qui retourne la colonne ItemNumber de toutes mes tables dans la base de données, mais jusqu'à présent, je n'ai pas réussi à le faire avec succès.Linq to SQl, sélectionnez la même colonne de plusieurs tables

Fondamentalement, j'ai une table pour chaque type de composant matériel dans un ordinateur, et chaque table a une colonne ItemNumber. J'ai besoin d'interroger toutes les tables en un seul coup, et de retourner les valeurs ItemNumber dans une liste/tableau plat. (Essentiellement, je veux être en mesure de faire le ci-dessous)

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

Vous cherchez en vain, quelqu'un pourrait me montrer un exemple de la façon de le faire? Ma meilleure tentative est la suivante, mais je ne comprends pas assez Sql pour accomplir cela.

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 }; 

Répondre

5

Ce que vous décrivez est une union:

SELECT ItemNumber DE tbl1 UNION SELECT ItemNumber DE tbl2

En 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 

Notez que l'utilisation UNIONs comme celui-ci ne sont pas vraiment très efficace. Vous obtenez l'ensemble de données entier dans un aller-retour à la base de données, mais le serveur de base de données doit faire une requête séparée pour chaque UNION, donc si vous envisagez de faire quelque chose de complexe avec beaucoup de données, mieux vaut repenser votre conception de base de données.

+0

Je viens d'éditer la disposition de code pour la rendre plus facile à lire. J'espère que ça ne vous dérange pas. –

+0

Je pense que je l'ai défait accidentellement! –

+0

@Jeff Opps formaté le code en même temps, j'ai roulé à votre version. –

1

Union Voir here

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) 
5

Ne pas utiliser Union - au lieu d'utiliser Concat!

  • Union de LinqToSql est mis en correspondance à l'Union de T-Sql .
  • de LinqToSql Concat est mappé sur T-Sql Union Tous.

La différence est que l'Union exige que les listes soient vérifiées les unes contre les autres et ont des doublons supprimés. Cette vérification coûte du temps et je m'attends à ce que vos numéros de pièces soient globalement uniques (n'apparaît dans une seule liste) de toute façon. Union Tous ignore cette vérification supplémentaire et le retrait des doublons.

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(); 
+2

Merci. J'étais comme: «Donde est l'équivalence de Union All en Linq2SQL? – Merritt