2009-01-26 73 views
2

我一直在试图开发一个linq查询,它返回数据库中所有表的ItemNumber列,但到目前为止我还没有能够成功完成。Linq到SQl,从多个表中选择相同的列

基本上我有一个计算机中每种硬件组件的表,每个表都有一个ItemNumber列。我需要在一个bang中查询所有表,然后返回一个扁平列表/数组中的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 }; 

回答

5

你所描述的是一个联盟:

SELECT ItemNumber FROM TBL 1 UNION SELECT ItemNumber FROM 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执行一次单独的查询,因此如果您计划对大量数据执行复杂的操作,那么重新考虑可能会更好一些你的数据库设计。

+0

我刚编辑了代码布局,使其更易于阅读。希望你不介意。 – 2009-01-26 23:19:37

+0

我想我意外地解开了! – 2009-01-26 23:20:47

1

联盟见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

不要使用联盟 - 改用Concat

  • LinqToSql的联合被映射到T-SQL的联合
  • LinqToSql的Concat被映射到T-Sql的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(); 
相关问题