2015-06-25 5 views
2

Мне нужна помощь в удалении дубликатов из списка адресов электронной почты. Мне нужно добавить код для группировки emailaddresses в классе emailaddresses. Sql возвращает повторяющиеся адреса электронной почты из-за разных телефонных номеров. Какие-либо предложения? Благодарю.Linq - группа каждого класса

Вот мой код: 1. Классы

public class Student 
{ 
    public string StudentId { get; set; } 
    public string Gender { get; set; } 
    public List<EmailAddresses> emailAddresses { get; set; } 
} 

public class EmailAddresses 
{ 
    public string EmailAddress { get; set; }  
} 

2. Данные, поступающие из SQL запроса

StudentId EmailAddresses IsPreferred Number TelephoneType                        
123456789 [email protected] FALSE 5556565 Present Evening Phone                        
123456789 [email protected] FALSE 8885566 Permanent Day Phone                        
123456789 [email protected] TRUE 5556565 Present Evening Phone                        
123456789 [email protected] TRUE 8885566 Permanent Day Phone                        
456789123 [email protected] TRUE 7513150 Business Day Phone                        
456789123 [email protected] TRUE 4123300 Present Day Phone                        
456789123 [email protected] FALSE 4123300 Present Day Phone 

3. Код

public List<Student> GetStudentData() 
{ 
    List<Student> dataStudent; 
    using (IDbConnection connection = RepositoryHelper.OpenConnection()) 
    { 
     dataStudent = connection.Query<dynamic>(
      "mystoredprocedure", 
      commandType: CommandType.StoredProcedure) 
       .GroupBy(x => x.StudentId) 
       .Select(x => new Student 
        { 
         StudentId = x.First().StudentId, 
         Gender = x.First().Gender, 
         emailAddresses = x.Select(ea => new EmailAddresses 
          { 
           EmailAddress = ea.emailAddresses 
          }).ToList() 
        }).ToList(); 

     return dataStudent; 
    } 
} 
+1

Не указывайте фрагменты кода/данных как фрагменты кода JavaScript, если они не являются. –

ответ

1

Хотя было бы предпочтительнее, чтобы отфильтровать дубликаты, прежде чем вернуться, она также увеличивает сложность вашего кода. Если ваш результирующий набор невелик, накладные расходы на память и процессор после фильтрации после того, как вы вернули данные, могут быть легко и легко получить нужные результаты. Вы можете использовать настраиваемый IEqualityComparer, чтобы проверять отдельные результаты и создавать новый список адресов электронной почты для каждой записи Студента, который содержит разные адреса электронной почты.

public List<Student> GetStudentData() 
{ 
    List<Student> dataStudent; 
    using (IDbConnection connection = RepositoryHelper.OpenConnection()) 
    { 
     dataStudent = connection.Query<dynamic>(
      "mystoredprocedure", 
      commandType: CommandType.StoredProcedure) 
       .GroupBy(x => x.StudentId) 
       .Select(x => new Student 
        { 
         StudentId = x.First().StudentId, 
         Gender = x.First().Gender, 
         emailAddresses = x.Select(ea => new EmailAddresses 
          { 
           EmailAddress = ea.emailAddresses 
          }).ToList() 
        }).ToList(); 

     dataStudent.ForEach(x => x.emailAddresses = x.emailAddresses 
      .Distinct(new StudentEmailEqualityComparer()).ToList()); 

     return dataStudent; 
    } 
} 

public class StudentEmailEqualityComparer : IEqualityComparer<EmailAddresses> 
{ 

    public bool Equals(EmailAddresses x, EmailAddresses y) 
    { 
     return x.EmailAddress.Equals(y.EmailAddress); 
    } 

    public int GetHashCode(EmailAddresses obj) 
    { 
     return obj.EmailAddress.GetHashCode(); 
    } 
} 
+0

Большое вам спасибо. Почти готово :). Класс EmailAddresses имеет одно свойство, называемое «IsPreferred». У меня возникли проблемы с обновлением строки foreach, чтобы добавить новую функцию. Какие-либо предложения. Я не могу правильно получить синтаксис. Я добавил свойство IsPreferred к классу StudentEmailEqualityComparer, и эта часть кажется прекрасной. Спасибо, я ценю это. – 1111lt

+0

Есть ли IsPreferred в вашей базе данных? Если это так, вы должны назначить его в emailAddresses = x.Select (ea => new EmailAddresses { EmailAddress = ea.emailAddresses }). ToList(), а не foreach –

+0

Это работает, спасибо вам большое. Я ошибся в своем конце. Я ценю вашу помощь. день!! – 1111lt

1

Если я получить вас правильно, вы должны получить различные значения для этого вы можете сделать, как это

List<Product> list = products 
        .GroupBy(a => a.Code) 
        .Select(g => g.First()) 
        .ToList(); 

или

Создать comperare и не пытаться выяснить отдельный объект,

статьи для полного кода : DistinctBy in Linq (Find Distinct object by Property)

class ProductComparare : IEqualityComparer<product> 
    { 
     private Func<Product, object> _funcDistinct; 
     public ProductComparare(Func<Product, object> funcDistinct) 
     { 
      this._funcDistinct = funcDistinct; 
     } 

     public bool Equals(Product x, Product y) 
     { 
      return _funcDistinct(x).Equals(_funcDistinct(y)); 
     } 

     public int GetHashCode(Product obj) 
     { 
      return this._funcDistinct(obj).GetHashCode(); 
     } 
    } 

var list2 = products.Distinct(new ProductComparare(a => a.Code)); 
+0

Благодарим вас за ответ. Я немного потерял, не могли бы вы помочь мне применить этот код к моему примеру выше. Объект-ученик позже преобразуется в JSON, и мне было интересно, как я могу избавиться от дубликатов в классе emailaddresses до того, как данные будут преобразованы. Спасибо, – 1111lt

+0

Любые предложения, пожалуйста? Я немного в отчаянии. Благодарю. – 1111lt

+0

@ 1111lt - замените продукт на класс ученика, и вы можете попробовать ... проверьте ссылку в ответе, которая показывает пример этого ... если вы хотите, чтобы диктовать по два свойства, чем вы можете сделать это два раза var list2 = students.Distinct (новый StudentComparare (a => a.id)); чем var list2 = list2.Distinct (новый StudentComparare (a => a.emailid)); может решить вашу проблему. –