Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 加入时以linq计数_C#_Linq_Join - Fatal编程技术网

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。我可能错了,但我认为,在哪里使用笛卡尔积