Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查值是否在另一个表中_C#_Linq - Fatal编程技术网

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);