选择LINQ中不存在子行的行

时间:2012-11-18 01:07:21

标签: c# linq linq-to-sql

我有以下表格

Clubs
- Id
- Name

Members
- Id
- ClubId linked to Clubs.Id
- Name

如何在LINQ中编写一个查询,该查询将为我提供一份没有任何成员的俱乐部列表?

PS:这里的术语应该是什么?会员表是俱乐部表的*。 (不是父母和孩子,但是?)

2 个答案:

答案 0 :(得分:3)

  

如何在LINQ中编写一个查询,它将为我提供一个俱乐部列表   没有任何成员?

你可以这样做:

from m in db.Members
where !db.Clubs.Any( c => (c.Id == m.ClubId))
select m;

关于第二个问题:

  

应该是正确的术语吗?成员表是*的   俱乐部表。 (不是父母和孩子,但是?)

不,不是。这不是父母与子女的关系,因为成员可以在俱乐部中存在。您的案例中MembersClubs之间的关系是a,他们在UML中称为 聚合 。但父母和孩子的关系或他们所谓的 组合 ,即 有一个 关系,子对象可以'与父母一起存在。那不是你的情况。

答案 1 :(得分:1)

这会为您提供没有成员的俱乐部列表:

from c in db.Clubs
where !db.Members.Any( m => m.ClubId == c.Id)
select c;

但我怀疑这样做的正确方法是与中间表的多对多关系。 (您的数据可能是一个例外?)如果您属于3个俱乐部,您会在会员表中记录3次吗?如果ClubId在Members表中,您必须这样做。必须对3条记录进行地址变更。这不是正确的方法。

所以从会员表中删除ClubId并添加一个只有MemberId和ClubId的Members_Clubs表,可以让你将一个会员与很多俱乐部联系起来。

然后声明如下:

from c in db.Clubs
where !db.Members_Clubs.Any( mc => mc.ClubId == c.Id)
select c;

在此,实体既不是“父”,也不是“孩子”。这使它们成为关联实体。