LINQ到SQL GroupBy:生成一个具有单个DB trip的2级分层集合

LINQ到SQL GroupBy:生成一个具有单个DB trip的2级分层集合,linq,group-by,Linq,Group By,假设数据库中有一个表,它有三列:代理ID、名称和值 我想获得一组按机构ID分组的配对 我该怎么做?我尝试了下面这样的方法,效果很好,但是为每个代理打了一个DB电话 from div in db.AgencyDivisionsENT group div by div.AgencyId into NamePairCollection select new KeyValuePair<int, IEnumerable<DivisionResults>>(N

假设数据库中有一个表,它有三列:代理ID、名称和值

我想获得一组按机构ID分组的配对

我该怎么做?我尝试了下面这样的方法,效果很好,但是为每个代理打了一个DB电话

from div in db.AgencyDivisionsENT
      group div by div.AgencyId into NamePairCollection
      select new KeyValuePair<int, IEnumerable<DivisionResults>>(NamePairCollection.Key,
             NamePairCollection.Select(k => new DivisionResults 
             { 
                     Name = k.Name, 
                     Value = k.Value
               ));
从db.agencydivision中的div发送
按div.AgencyId将div分组到NamePairCollection中
选择新的KeyValuePair(NamePairCollection.Key,
NamePairCollection.Select(k=>newdivisionresults
{ 
Name=k.Name,
值=k.值
));

我想以这样的方式结束:IEnumerable

使用链语法,它将是:

db.AgencyDivisionsENT
.GroupBy(x=>x.AgencyId)
.ToDictionary(x=>x.Key, g=>g.Select(x=>new { k.Name, k.Value }).ToArray());

使用链语法,它将是:

db.AgencyDivisionsENT
.GroupBy(x=>x.AgencyId)
.ToDictionary(x=>x.Key, g=>g.Select(x=>new { k.Name, k.Value }).ToArray());

避免此类查询往返的最简单方法是在客户端分组-通过调用.AsEnumerable():

这绝不是低效的——只要:

  • 使用initial.select语句仅从服务器中选择所需的数据
  • 如果需要.Where语句来过滤数据,则将其放在.AsEnumerable之前
  • 您选择的是细节行(如本例所示),而不仅仅是聚合

避免此类查询往返的最简单方法是在客户端分组-通过调用.AsEnumerable():

这绝不是低效的——只要:

  • 使用initial.select语句仅从服务器中选择所需的数据
  • 如果需要.Where语句来过滤数据,则将其放在.AsEnumerable之前
  • 您选择的是细节行(如本例所示),而不仅仅是聚合

感谢您的回答。GroupBy和ToDictionary Lambda非常有用。但是,这仍然导致了许多到DB的往返(每个机构一次)。感谢您的回答。GroupBy和ToDictionary Lambda非常有用。但是,这仍然导致了许多到DB的往返(每个机构一次)。太棒了!.AsEnumerable()是让它按照我想要的方式工作的魔法尘。谢谢。太棒了!AsEnumerable()是让它按照我想要的方式工作的魔法尘。谢谢。