C# 检查值是否在另一个表中
我有两张桌子:“个人”和“会员”。一个成员总是一个人,但一个人并不总是一个成员 我想要一份所有非会员的名单 我试着这样做,但没有成功:C# 检查值是否在另一个表中,c#,linq,C#,Linq,我有两张桌子:“个人”和“会员”。一个成员总是一个人,但一个人并不总是一个成员 我想要一份所有非会员的名单 我试着这样做,但没有成功: var NonMembers = PersonsDB.GetAll().Where(x => !Members.Contains(x)); 如何解决此问题?您的成员表(您必须)中有一些外键(如PersonId),您可以将其与人员的Id进行比较,如下所示: var NonMembers = PersonsDB.GetAll
var NonMembers = PersonsDB.GetAll().Where(x => !Members.Contains(x));
如何解决此问题?您的成员
表(您必须)中有一些外键(如PersonId
),您可以将其与人员的Id进行比较,如下所示:
var NonMembers =
PersonsDB.GetAll().Where(x => !Members.Any(y=>y.PersonId==x.Id));
如果存在导航属性(对应于数据库外键),则可以将其检查为空:
var NonMembers = PersonsDB.GetAll().Where(p => p.Member == null);
您是否看过Except()
扩展名
var nonMembers = PersonsDB.GetAll().Except(Members);
这几乎是通俗易懂的英语
编辑
假设
persondb.GetAll()
返回一个IEnumerable
Members
是一个IEnumerable
成员
扩展个人
:
您需要编写自己的比较器:
public class IsPersonMemberComparer : EqualityComparer<Person>
{
public override bool Equals(Person x, Person y)
{
var maybeMember = x;
var definitelyMember = (Member) y;
// test whether x and y are the same person
return maybeMember.SocialSecurityNumber == definitelyMember.SocialSecurityNumber;
}
public override int GetHashCode(Person obj)
{
return obj.GetHashCode();
}
}
Person
和Member
表之间的关系是什么?您使用的是linq到sql吗?linq到实体?请适当标记。你目前的方法有什么错误?人!=在任何情况下都是成员,所以!Members.Contains(Person)
将始终为真。你比我快了1秒D:这假设Person
和Member
表是同一类型的,这在数据库中通常不是这样的。@AndersAbel假设表Person和Member中有重复的数据,希望数据库中不是这样。编辑:哦,等等,OP提到事实就是这样。@StevenLiekens完全正确。Q并不完全清楚表之间的关系,但它应该带有外键,外键在linq中转换为导航属性。这假设Person表和Member表是相同的类型,这在数据库中通常不是这样。@AndersAbel我仔细考虑了一下。最初的规范一开始就很糟糕。这个问题没有干净的解决办法。这是为了我!谢谢你。
var comparer = new IsPersonMemberComparer();
var nonMembers = PersonsDB.GetAll().Except(Members, comparer);
var NonMembers = PersonsDb.GetAll().Except(Members);