题
在我的应用程序中,公司可以有很多员工,每个员工可能都有多个电子邮件地址。
数据库架构与这样的表相关联:
公司 - > Company EmployeeXref->员工 - > EmployeeadDressXref->电子邮件
我正在使用实体框架,我想创建一个LINQ查询,该查询返回公司名称,并在其员工的电子邮件地址的逗号分隔列表中。这是我正在尝试的查询:
from c in Company
join ex in CompanyEmployeeXref on c.Id equals ex.CompanyId
join e in Employee on ex.EmployeeId equals e.Id
join ax in EmployeeAddressXref on e.Id equals ax.EmployeeId
join a in Address on ax.AddressId equals a.Id
select new {
c.Name,
a.Email.Aggregate(x=>x + ",")
}
Desired Output:
"Company1", "a@company1.com,b@company1.com,c@company1.com"
"Company2", "a@company2.com,b@company2.com,c@company2.com"
...
我知道这个代码是错误的,我认为我错过了一个小组,但这说明了这一点。我不确定语法。这甚至可能吗?谢谢你的帮助。
解决方案
现在,我解决了这个问题:
from c in Company
join ex in CompanyEmployeeXref on c.Id equals ex.CompanyId
join e in Employee on ex.EmployeeId equals e.Id
join ax in EmployeeAddressXref on e.Id equals ax.EmployeeId
join a in Address on ax.AddressId equals a.Id
group a.Email by new {c.Name} into g
select new {
Company=g.Key.Name,
Email=g.Select(e=>e).Distinct()
}
).ToList()
.Select(l=>
new {
l.Name,
Email=string.Join(",", l.Email.ToArray())
}
)
其他提示
实际上,在纯LINQ到SQL(或实体框架,无论您使用的是哪个)中,这实际上很难,因为SQL Server本身没有任何可以产生逗号界定列表的聚合操作员,因此它无法转换整个语句成一个查询。我可以给您一个“单态” LINQ到SQL答案,但实际上它不会给您很好的性能,而且我不确定它是否在EF中是否有效。
这很丑陋,但是如果您只是进行定期加入,实现结果,然后使用LINQ与对象进行串联:
var rows =
(from c in Company
join ex in CompanyEmployeeXref on c.Id equals ex.CompanyId
join e in Employee on ex.EmployeeId equals e.Id
join ax in EmployeeAddressXref on e.Id equals ax.EmployeeId
join a in Address on ax.AddressId equals a.Id
select new
{
c.Name,
a.Email
}).AsEnumerable();
var emails =
from r in rows
group r by r.Name into g
select new
{
Name = g.Key,
Emails = g.Aggregate((x, y) => x + "," + y)
};
不隶属于 StackOverflow