VB。 NET:LINQ to SQL等效于Count - 按查询分组

时间:2015-04-11 06:59:40

标签: vb.net linq-to-sql

我正在尝试转换此查询(已在运行):

Select building.Name, Count(people.ID) as NumberOfUser
From tblBuilding as building left outer join tblPeople as people on building.ID = people.buildingID
Group by building.Name

给出了这样的结果:

Name          | NumberOfUser
----------------------------
WestBuilding    50
EastBuilding    70
SouthBuilding   0
NorthBuilding   2

Linq to SQL。看看我的尝试:

Dim db As New MyDatabaseDataContext
Dim query = From building In db.tblBuilding
            From people In db.tblPeople.Where(Function(x) building.ID = x.buildingID).DefaultIfEmpty
            Group building, people By building.ID, building.Name Into grp
                Select ID, Name, grp.Count
Return query.ToList

它起初似乎起作用。但当我检查一个没有人的建筑物时,Count专栏说有1个。就像这样:

Name          | NumberOfUser
----------------------------
WestBuilding    50
EastBuilding    70
SouthBuilding   1
NorthBuilding   2

因为尽管那个建筑物没有人,但它确实在结果查询中出现过一次,因此它计为1.换句话说,Count语句实际上计算每个建筑物在结果表中出现的时间而不是每个建筑物中有多少人建筑,因此没有人建造,结果是错误的。

有什么解决方法吗?

1 个答案:

答案 0 :(得分:1)

你是对的,要解决这个问题,你需要测试是否有人,就像你对count(people.Id)所做的那样

Dim db As New MyDatabaseDataContext
Dim query = From building In db.tblBuilding
            From people In db.tblPeople.Where(Function(x) building.ID = x.buildingID).DefaultIfEmpty
            Group building, people By building.ID, building.Name Into Group, Count(Not IsNothing(people))
'Select ID, Name, grp.Count
Return query.ToList
相关问题