我有两张桌子:" Person"和"会员"。成员总是一个人,但一个人并不总是一个成员。
我希望获得所有非会员的名单。
我试着这样做,但没有运气:
var NonMembers = PersonsDB.GetAll().Where(x => !Members.Contains(x));
如何解决这个问题?
答案 0 :(得分:4)
var NonMembers = PersonsDb.GetAll().Except(Members);
答案 1 :(得分:3)
您的PersonId
表格中有一些外键(例如Member
)(您必须),您可以将其与Person
的ID进行比较,如下所示:
var NonMembers =
PersonsDB.GetAll().Where(x => !Members.Any(y=>y.PersonId==x.Id));
答案 2 :(得分:3)
您是否查看了Except()
扩展程序?
var nonMembers = PersonsDB.GetAll().Except(Members);
这几乎是简单的英语。
修改强>
假设
PersonsDB.GetAll()
会返回IEnumerable<Person>
Members
是IEnumerable<Member>
Member
延伸Person
:你需要编写自己的比较器:
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();
}
}
现在在测试相等性时指定此比较器。
var comparer = new IsPersonMemberComparer();
var nonMembers = PersonsDB.GetAll().Except(Members, comparer);
答案 3 :(得分:1)
如果存在导航属性(对应于数据库外键),则可以将其检查为null:
var NonMembers = PersonsDB.GetAll().Where(p => p.Member == null);