C# 加入时以linq计数
我有两个表,站点和客户。我想统计每个网站注册的客户数量。我已加入,我将用以下内容返回计数:C# 加入时以linq计数,c#,linq,join,C#,Linq,Join,我有两个表,站点和客户。我想统计每个网站注册的客户数量。我已加入,我将用以下内容返回计数: var siteData = ( from site in db.Site join cust in db.Customer on site.SiteID equals cust.SiteID group cust by site into g select new vm_SiteList
var siteData = (
from site in db.Site
join cust in db.Customer on site.SiteID equals cust.SiteID
group cust by site into g
select new vm_SiteList
{
SiteName = g.Key.SiteName,
Customers = g.Count()
}).ToList();
我的问题是那些注册了0个客户的站点没有显示。有人能告诉我,如果要包含0个客户的站点,我缺少什么吗?您需要使用DefaultIfEmpty方法使用左外部联接来获取没有站点的所有客户
var siteData = (
from site in db.Site
join cust in db.Customer on site.SiteID equals cust.SiteID
group cust by site into g
from subCust in g.DefaultIfEmpty()
select new vm_SiteList
{
SiteName = subCust?.Key.SiteName ?? string.Empty,
Customers = g.Count()
}).ToList();
你可以试试这个。除了使用join,您还可以使用let关键字获取计数。而且,它将比使用join更快
var siteData = (
from site in db.Site
let customerCount = db.Customer.Where(p=>p.SiteID == site.SiteID).Count()
select new vm_SiteList
{
SiteName = site.SiteName,
Customers = customerCount
}).ToList();
如果您没有客户,那么您就没有站点ID,因此您没有选择这些记录,也无法对它们进行计数。请使用左连接,以便始终列出站点:检查我的answer@Florian-是的,我理解这个问题。我本可以用sql生成一个解决方案,但linq对我来说是个新手。thanks@Florian它将统计所有站点。你可以试试看。他想知道该网站的客户数量。实际上我最喜欢这个答案。这对我来说是最容易理解的。感谢所有花时间回复的人。如果where子句失败,那么它将返回一个空序列,好吧,我错过了这一点。我的缺点是,它很好:顺便说一句,在巨大的记录集上,我认为你应该使用join。我可能错了,但我认为,在哪里使用笛卡尔积