-1

我有两张桌子Datacenter,一张是Subnet

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值的 2 个列表。因此,例如,如果我的Subnet表有 4 个唯一DatacenterId值,则查询输出需要是 4 个单独的列表。

4

1 回答 1

5

您永远无法从单个查询中获取多个集合。这只是所有 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以获取其中的各个列表。或者,您可以在查询中获得一点幻想并创建一个字典(通过使用ToDictionary()onmyList以便您可以通过键值(例如 DataCenterID)访问各个集合。

于 2013-09-29T11:40:34.457 回答