我有两个表:“Person”和“Member”。成员总是一个人,但一个人并不总是一个成员。检查值是否在另一个表
我想要列出所有不是成员的人。
我试图做这种方式,但没有运气:
var NonMembers = PersonsDB.GetAll().Where(x => !Members.Contains(x));
如何解决这个问题?
我有两个表:“Person”和“Member”。成员总是一个人,但一个人并不总是一个成员。检查值是否在另一个表
我想要列出所有不是成员的人。
我试图做这种方式,但没有运气:
var NonMembers = PersonsDB.GetAll().Where(x => !Members.Contains(x));
如何解决这个问题?
你有一些外键(如PersonId
)在Member
表(必须),你可以这样用编号进行比较的Person
:如果有一个导航属性
var NonMembers =
PersonsDB.GetAll().Where(x => !Members.Any(y=>y.PersonId==x.Id));
这是为我做的!谢谢。 – Stanko
(对应于一个数据库外键)你可以检查它是空的:
var NonMembers = PersonsDB.GetAll().Where(p => p.Member == null);
你看过Except()
的扩展吗?
var nonMembers = PersonsDB.GetAll().Except(Members);
这几乎是纯英文的。
EDIT
假设
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);
这假定Person和Member表是相同的类型,这在数据库中通常不是这种情况。 –
@AndersAbel我想到了更多。最初的规范是非常可怕的开始。这个问题没有干净的解决方案。 –
var NonMembers = PersonsDb.GetAll().Except(Members);
什么'Person'和'Member'表之间的关系? – ekad
你在使用linq-to-sql吗? LINQ到实体?请适当标记。你目前的做法有哪些错误? –
Person!=无论如何都是Member,所以'Members.Contains(Person)'永远是真的。 –