2014-02-11 2 views
3

У меня есть две таблицы: «Лицо» и «Пользователь». Член всегда человек, но человек не всегда член.Проверьте, находится ли значение в другой таблице

Я хочу получить список всех лиц, которые не являются членами.

Я пытался сделать это так, но не повезло:

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

Как решить эту проблему?

+0

Что отношение между '' Person' и Member' таблицы? – ekad

+2

Вы используете linq-to-sql? LINQ к сущности? Пожалуйста, отметьте соответствующим образом. Что вы думаете о своем нынешнем подходе? –

+0

Person! = Member в любом случае, поэтому '! Members.Contains (Person)' всегда будет true. –

ответ

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

Это почти простой английский.

РЕДАКТИРОВАТЬ

Предполагая, что

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

Это предполагает, что таблицы Person и Member являются одним и тем же типом, что обычно не относится к базам данных. –

+0

@AndersAbel Я подумал об этом еще немного. Первоначальная спецификация просто ужасна для начала. Нет ничего чистого решения этой проблемы. –

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

Ты избил меня на 1 секунду. D: –

+0

ха-ха не уверен, что я сделал, я видел твои показания, как я уже писал! – James

+1

Предполагается, что таблицы 'Person' и' Member' - это тот же тип, что обычно не относится к базам данных. –

Смежные вопросы