2014-02-11 181 views
3

我有两个表:“Person”和“Member”。成员总是一个人,但一个人并不总是一个成员。检查值是否在另一个表

我想要列出所有不是成员的人。

我试图做这种方式,但没有运气:

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

如何解决这个问题?

+0

什么'Person'和'Member'表之间的关系? – ekad

+2

你在使用linq-to-sql吗? LINQ到实体?请适当标记。你目前的做法有哪些错误? –

+0

Person!=无论如何都是Member,所以'Members.Contains(Person)'永远是真的。 –

回答

3

你有一些外键(如PersonId)在Member表(必须),你可以这样用编号进行比较的Person:如果有一个导航属性

var NonMembers = 
       PersonsDB.GetAll().Where(x => !Members.Any(y=>y.PersonId==x.Id)); 
+1

这是为我做的!谢谢。 – Stanko

1

(对应于一个数据库外键)你可以检查它是空的:

var NonMembers = PersonsDB.GetAll().Where(p => p.Member == null); 
3

你看过Except()的扩展吗?

var nonMembers = PersonsDB.GetAll().Except(Members); 

这几乎是纯英文的。

EDIT

假设

  • 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); 
+0

这假定Person和Member表是相同的类型,这在数据库中通常不是这种情况。 –

+0

@AndersAbel我想到了更多。最初的规范是非常可怕的开始。这个问题没有干净的解决方案。 –

4
var NonMembers = PersonsDb.GetAll().Except(Members); 
+0

你打我1秒D: –

+0

哈哈不知道我做了什么,我看到你的显示就像我发布! – James

+1

这假设'Person'和'Member'表是相同的类型,这在数据库中通常不是这种情况。 –

相关问题