C# 选择LINQ中不存在子行的行

C# 选择LINQ中不存在子行的行,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我有下列表格 Clubs - Id - Name Members - Id - ClubId linked to Clubs.Id - Name 我如何在LINQ中编写一个查询,以提供没有任何会员的俱乐部列表 PS:这里正确的术语应该是什么?members表是Clubs表的*部分。(不是父母和孩子,而是?) 我怎样才能用LINQ写一个查询,让我得到一个 没有会员吗 您可以这样做: from m in db.Members where !db.Clubs.Any( c => (c.Id

我有下列表格

Clubs
- Id
- Name

Members
- Id
- ClubId linked to Clubs.Id
- Name
我如何在LINQ中编写一个查询,以提供没有任何会员的俱乐部列表

PS:这里正确的术语应该是什么?members表是Clubs表的*部分。(不是父母和孩子,而是?)

我怎样才能用LINQ写一个查询,让我得到一个 没有会员吗

您可以这样做:

from m in db.Members
where !db.Clubs.Any( c => (c.Id == m.ClubId))
select m;
关于第二个问题:

这里应该使用正确的术语吗?成员表是一个*of 俱乐部的桌子。(不是父母和孩子,而是?)


不,不是。这不是父母和孩子的关系,因为一个成员可以在没有俱乐部的情况下生存。在你的例子中,
成员
俱乐部
之间的关系是一种,他们在UML中称之为,聚合。但是父对象和子对象的关系,或者他们称之为组合的关系,即有一个关系,没有父对象,子对象就不可能存在。这不是你的情况。

这会给你一个没有会员的俱乐部列表:

from c in db.Clubs
where !db.Members.Any( m => m.ClubId == c.Id)
select c;
但我怀疑正确的方法是使用中间表建立多对多关系。(您的数据可能是一个例外?)如果您属于3个俱乐部,您会在会员表中记录3次吗?如果ClubId在Members表中,则必须执行此操作。必须更改3条记录的地址。这不是正确的方法

因此,从Members表中删除ClubId并添加一个仅包含MemberId和ClubId的Members\u Clubs表将允许您将单个成员与多个俱乐部关联

那么,该声明将如下所示:

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

在这种情况下,两个实体都不是“父”或“子”。这使它们成为关联实体。

如果这是针对SQL表的,请选择Many转换为左连接,这可能是更好的选择。子表上的Where可能会导致提取所有记录,然后在客户端进行筛选。