如何使用单个linq查询获取多个列表?

时间:2013-09-29 09:43:33

标签: c# linq

我有两个表,一个是DatacenterSubnet

Datacenter有一个主键,Subnet的外键值为DatacenterId

我需要结果,例如来自DatacenterId表的每个Subnet的不同列表。

Id DatacenterId   name      

1       1         kishore    

2       1          ..       

3       1          ..       

4       2          ..        

5       2          ..        

6       2          ..       

我需要使用DatacenterId = 1另一个DatacenterId = 2

获得两个列表一

我当前的查询并不是很有效,因为我希望并且我不确定如何纠正它。

var myList = from o in db.EWB_SiteSubNet 
             where edbCenterIdList.Contains(o.DataCenterID) 
             select o; 

查询运行时,myList包含一个包含20条记录的列表。我需要的是为表中的每个唯一DatacenterId值列出一个。因此,例如,如果我的Subnet表有4个唯一DatacenterId值,则查询输出需要是4个单独的列表。

1 个答案:

答案 0 :(得分:3)

您永远无法从单个查询中获取多个集合。这只是所有LINQ(对象,SQL和实体)的基本规则。返回值将始终是IEnumerable<T>的变体,具体取决于查询和LINQ的风格。

但是,在查询中,您可以对对象进行分组并返回集合集合,这是我们需要采取的方法。

因此您的原始查询有效:

var myList = from o in db.EWB_SiteSubNet 
             where edbCenterIdList.Contains(o.DataCenterID) 
             select o; 

但它只会让你只有一半,因为你只是返回SubNet中与现有DataCenterID匹配的所有记录。

由于您希望按DataCenterID分组的记录,您需要执行GroupBy

var myList = from o in db.EWB_SiteSubNet 
             where edbCenterIdList.Contains(o.DataCenterID) 
             group o by o.DatacenterId into g
             select g.Select(r => r.ToList());

现在myList将成为列表的集合(在这种情况下为IEnumerable<List<T>>),您可以迭代myList以获取其中的各个列表。或者,您可以在查询中获得更多信息并创建字典(使用myList上的ToDictionary(),以便您可以通过键值(例如DataCenterID)访问各个集合。