2016-03-23 4 views
1

1- я загружаю список лиц из CSV-файла и сохранить его в списке загружаю также список лиц из БД и сохранить его в спискеПроверьте список объектов уже существует в другом списке объектов

как я могу получить пользователей, которые они находятся в файле csv, но не в базе данных?

Например: DB имеет 5 пользователей (А, В, С, D, Е), CSV имеет 4 пользователей (В, Е, Q, P) код должен возвращать список пользователей (Q, P)

public class Person 
{ 
    public string UserName { get; set; } 
    public int Age { get; set; } 
} 



public class App 
     { 
      private IEnumerable<Person> usersDb; 
      private IEnumerable<Person> usersCsv; 

      public App(int age) 
     { 
      usersDb = GetUsersFromDb(age); 
      usersCsv = GetUsersFromCsv(age); 
     } 

     public void AddMissingUsers() 
     { 
      var missingUsers = usersCsv.Where(x => !usersDb.Any(y => x.UserName.Trim().ToUpper(). 
       Equals(y.UserName.Trim().ToUpper()))); //I tried this one 
      // add to database 
     } 

    } 

Дополнительный вопрос

Ps: Я использую сущности framwork 6 есть лучший способ, чтобы выполнить задачу, показанную в моем коде? установить все пользователи из базы данных, а затем проверить, существует ли это?

С другой стороны, если я делаю обратное и проверяю каждую строку в моем файле csv, если он существует в databse, это также может быть длительным, поскольку файл может содержать много строк.

+0

Что случилось с вашей попытки? Это не выглядит явно неправильно. Кроме того, чувствительность к регистру обычно определяется в сопоставлении базы данных, поэтому вам может не понадобиться называть «ToUpper» вообще – Rob

+1

. Вы также можете посмотреть ['MERGE в SQL Server'] (https://msdn.microsoft.com/ru -AU/library/bb510625.aspx) - это означает, что вы выгружаете новый файл во временную таблицу и объединяете результаты (в этом случае просто вставляйте, когда не сопоставляетесь), затем отбрасывайте временную таблицу. Очень быстро для больших объемов данных. – Rob

ответ

1

В этом случае вы можете использовать Except.

var usersNotInDb = usersCsv.Except(usersDb).ToList(); 
context.Users.AddRange(usersNotInDb); 
context.SaveChanges(); 
1

Это должно решить вашу проблему, Измените класс Person следующим образом,

public class Person : IEqualityComparer<Person> 
    { 
     public string UserName { get; set; } 
     public int Age { get; set; } 

     bool IEqualityComparer<Person>.Equals(Person x, Person y) 
     { 
      if (x.UserName == y.UserName) 
       return true; 
      return false; 
     } 

     int IEqualityComparer<Person>.GetHashCode(Person obj) 
     { 
      return base.GetHashCode(); 
     } 
    } 

Затем измените запрос к,

Person p = new Person(); 
     var notInDBList = usersCsv.Except(usersDb, p).ToList(); 
Смежные вопросы