检查值是否在另一个表中

时间:2014-02-11 12:50:16

标签: c# linq

我有两张桌子:" Person"和"会员"。成员总是一个人,但一个人并不总是一个成员。

我希望获得所有非会员的名单。

我试着这样做,但没有运气:

var NonMembers = PersonsDB.GetAll().Where(x => !Members.Contains(x));

如何解决这个问题?

4 个答案:

答案 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>
  • MembersIEnumerable<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);