我有3种对象:Agency,BusinessUnit和Client(每个都有各自的表)
就层次结构而言,代理拥有BusinessUnit,而BusinessUnit拥有客户。
我有3个C#POCO对象来表示它们(我通常在其中选择new {},而不是使用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; }
}
您可以看到代理包含一个BusinessUnits列表,而BusinessUnits包含一个客户端列表。
我在数据库中还有一个名为BAC_Map的映射表,其中说出哪个拥有哪个,看起来像这样:
如何构造查询,以便查询并返回代理商列表?就是说,我希望每个代理机构都设置其BusinessUnit对象列表,并且我希望BusinessObjects列表设置其Clients列表。
我可以进行基本的LINQ查询,但是关于Map表和倍数的问题让我有些头疼?查询。
我如何构造像GetAllAgencies()这样的方法,该方法不仅可以查询所有代理,还可以填充代理拥有的BusinessUnit和那些BusinessUnit拥有的客户?
编辑:任何提示或信息,不胜感激。我需要加入吗?是否需要多个查询才能返回代理商列表,并填充其子成员?
最佳答案
如果将所有四个表(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();
如果提供了适当的过滤器(请参见注释掉的
where
子句),则仅将表中所需的部分拉到内存中。这是在这里工作的标准SQL连接。关于c# - 如何使用LINQ查询此分层数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1041312/