我有两个表,一个是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
值列出一个。因此,例如,如果我的Subnet
表有4个唯一DatacenterId
值,则查询输出需要是4个单独的列表。
答案 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)访问各个集合。