2015-01-20 3 views
-3

В настоящее время я работаю с LINQ и обычным объектом, и, честно говоря, я немного застрял. У меня есть пользовательский класс, который представляет человека. Это выглядит следующим образом:Как я могу отфильтровать один список по отношению к другому списку?

private class Person 
{ 
    private String Name; 
    private String Firstname; 

} 

Теперь представьте себе следующую ситуацию: У меня есть два массива Person (Person1 и Person2). Я хочу получить список тех, которые имеют одинаковый (в списке 2) имя, но не существует в списке 1 (для других свойств).

Пример:

List<Person> Person1=new List<Person>(){new Person(){Name="Marley", Firstname="Bob"}, 
            new Person(){Name="Smith", Firstname="David"}, 
            new Person(){Name="Smith", Firstname="Thomas"}, 
            new Person(){Name="Flint", Firstname="John"}}; 

List<Person> Person2=new List<Person>(){new Person(){Name="Marley", Firstname="Bob"}, 
            new Person(){Name="Smith", Firstname="David"}, 
            new Person(){Name="Smith", Firstname="Thomas"}, 
            new Person(){Name="Smith", Firstname="Sandy"}, 
            new Person(){Name="Smith", Firstname="Catherine"}, 
            new Person(){Name="Flint", Firstname="John"}, 
            new Person(){Name="Simons", Firstname="Paul"}, 
            new Person(){Name="Flint", Firstname="Rachel"}}; 

В SQL запрос будет выглядеть следующим образом:

SELECT * FROM Person1 
WHERE Person1.NAME IN (SELECT Person2.Name FROM Person2 
         WHERE Person2.Name=Person1.Name 
         AND Person1.Firstname<>Person2.Firstname) 

Результат будет Сэнди/Кэтрин Смит и Рэйчел Флинт (НЕ Paul Simons)

Как Могу ли я сделать это в Linq?

+5

Что вы пытались сделать до сих пор? Какие у вас проблемы с вашими попытками? Какое исследование вы сделали, чтобы выполнить эти операции в LINQ и каким образом они не смогли решить вашу проблему? – Servy

+1

Добро пожаловать в переполнение стека! Чтобы получить наилучшую помощь здесь, вам нужно добавить в вопрос, что вы протестировали, и как это не удается. –

ответ

0

Вы говорите, что хотите все с «тем же именем, но не с тем же именем», но ваш запрос sql ищет все с тем же именем , но с другим первым именем.

Если хотят, чтобы все лицо из Person1, которые также в Person2 (в соответствии с Name) но FirstName отличается:

var query = Person1 
    .Where(p => Person2 
     .Any(p2 => p2.Name == p.Name && p2.Firstname != p.Firstname)); 

Если вы хотите использовать список query.ToList(), если вы хотите массив использовать query.ToArray().

Если вместо этого вы хотите, чтобы все из Person2:

var query = Person2 
     .Where(p2 => Person1 
      .Any(p1 => p2.Name == p1.Name && p2.Firstname != p1.Firstname)); 
+0

Вы проверили результаты этого? – Jonesopolis

+0

@ Jonesy: Я посмотрел на это требование. У вас есть некоторые оговорки? Легко изменить, если OP хочет найти всех лиц, где 'FirstName' равно, но' Name' отличается. –

+0

работает против его тестовых данных. Я получаю «Дэвид Смит», «Томас Смит» и «Джон Флинт» – Jonesopolis

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