如何使用LINQ查询此分层数据?

Kin*_*tor 5 c# linq linq-to-sql

我有3种对象:Agency,BusinessUnit和Client(每个都有各自的表)

在层次结构方面,代理商拥有BusinessUnits,BusinessUnits拥有客户.

我有3个C#POCO对象来表示它们(我通常选择新的{},而不是使用LINQ生成的类):

public class Agency
{
    public IEnumerable<BusinessUnit> BusinessUnits { get; set; }
}

public class BusinessUnit
{
    public IEnumerable<Client> Clients { get; set; }
}

public class Client
{
    public int NumberOfAccounts { get; set; }
    public Decimal AmountOfPlacement { get; set; }
    public Decimal AvgBalance { get; set; }
    public Double NeuPlacementScore { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

您可以看到代理商包含BusinessUnit列表,BusinessUnits包含客户列表.

我在数据库中也有一个名为BAC_Map的映射表,它说哪个拥有哪个,它看起来像这样:

替代文字

如何构建查询,以便查询并返回代理列表?这意味着,我希望每个代理商都设置其BusinessUnit对象列表,并且我希望BusinessObjects列表设置其客户端列表.

我可以做基本的LINQ查询,但这对于Map表和多个来说有点过头了吗?查询.

我怎样才能构建像GetAllAgencies()这样的方法,它不仅可以查询所有代理商,还可以查询代理商拥有的BusinessUnit,以及那些BusinessUnits拥有的客户端?


编辑:任何提示或信息表示赞赏.我需要加入吗?这是否需要多个查询才能返回代理商列表,并填充其子成员?

Amy*_*y B 4

如果将所有四个表(Agency、BusinessUnit、Client、Map)放在 linq to sql 设计器上,并绘制从 Map 到其他三个表的关系,Map 上将会有一些有用的属性。

  //construct a query to fetch the row/column shaped results.
var query = 
  from m in db.map
  //where m.... ?
  let a = m.Agency
  let b = m.BusinessUnit
  let c = m.Client
  // where something about a or b or c ?
  select new {
    AgencyID = a.AgencyID,
    AgencyName = a.Name,
    BusinessUnitID = b.BusinessUnitID,
    ClientID = c.ClientID,
    NumberOfAccounts = c.NumberOfAccounts,
    Score = c.Score
  };
  //hit the database
var rawRecords = query.ToList();

  //shape the results further into a hierarchy.    
List<Agency> results = rawRecords
  .GroupBy(x => x.AgencyID)
  .Select(g => new Agency()
  {
    Name = g.First().AgencyName,
    BusinessUnits = g
    .GroupBy(y => y.BusinessUnitID)
    .Select(g2 => new BusinessUnit()
    {
      Clients = g2
      .Select(z => new Client()
      {
        NumberOfAccounts = z.NumberOfAccounts,
        Score = z.Score
      })
    })
  })
  .ToList();
Run Code Online (Sandbox Code Playgroud)

如果提供了适当的过滤器(请参阅注释掉的where子句),那么只有表中所需的部分才会被拉入内存。这是这里起作用的标准 SQL 连接。