Amr Mohammad Rashad Ответов: 1

Фильтр Linq возвращает повторенные данные


Приветствия,

Я пытаюсь отфильтровать список объектов с помощью метода Linq, где, однако, после выполнения фильтра список возвращает первый элемент, который выполнил условие, повторенное по всему списку (т. е. повторенное количество раз для других элементов, также выполняющих это условие). Например, я возвращаю сотрудников только с идентификатором страны = 3, и у меня должно быть три сотрудника зеленый, синий и красный, однако я получил только синий, повторенный 3 раза синий, Синий, синий.

Я использую MySql в качестве резервного хранилища и использую Entity Framework с объектом MySqlConnection

public class Repository<T> : IRepository<T> where T : class
{
    public IEnumerable<T> SelectAll()
    {
        return db.Set<T>().ToList();
    } 
}


public class AnalyticsRepository : Repository<Analytics>
{
    public new List<Analytics> SelectAll()
    {
            return base.SelectAll().ToList<Analytics>();
    }
}


public IEnumerable<Analytics> SelectByCountryAndProduct(string countrycriteria, string productcriteria)
{
  List<Analytics> result = null;

  using (AppDbContext db = new AppDbContext(factory.GetConnection()))
  {
     db.Database.CommandTimeout = 6000;
     analyticsRepository = new AnalyticsRepository(db);
     result = analyticsRepository.SelectAll();
  }

  return result.Where(a => a.CountryId.ToString() == countrycriteria && a.ProductId.ToString() == productcriteria).ToList();
}


Что я уже пробовал:

Отладка и попытка другого образца решения в списке с фиктивными данными, который работает нормально

Maciej Los

Кажется, что SelectAll метод возвращает List(of Analytics), который не является List(of Employees)...

Amr Mohammad Rashad

Я просто привожу пример того, что происходит. Действительно, метод SelectAll в коде, который я опубликовал, возвращает список аналитики. Проблема не в том, какой тип возвращается, а в том, что результат содержит повторяющийся элемент. Например, если условие фильтра должно возвращать Analytics1, Analytics2, Analytics3 и Analytics4. Он возвращает Analytics1, повторенный 4 раза Analytics1, Analytics1, Analytics1 и Analytics1

Maciej Los

Ну, пожалуйста, в следующий раз используйте "ответ" вигдет, если вы хотите сообщить мне о своем ответе.
Кажется, мы не понимаем друг друга. Если объект Analytics - это набор объектов, ваш код работает нормально, потому что именно так работают соединения на уровне базы данных...
Понял?

Amr Mohammad Rashad

OK! I will in the next time sorry did not see it :). I know what causes the problem. The problem was in the model configuration. I configured the Analytics model with an composite key, countryid and productid, respectively, the problem is that productid and countryid are repeated, they are not uniquely identify each individual row in the database. As a result the returning result list in general takes the first occurrence that fulfill the condition and repeated it number of times for all other objects that fulfill the condition too within the returned list (i.e., after fulfilling the condition I should have 532 unique object within the list of Analytics, however, I got 532 object within the list but they are not unique it took the first occurrence that fulfill the condition and repeated it 532 times).

Maciej Los

Хорошо, пожалуйста, смотрите мой ответ.
Хорошо, пожалуйста, опубликуйте свой ответ.

1 Ответов

Рейтинг:
6

Amr Mohammad Rashad

Я заменил его

public class AnalyticsConfiguration : EntityTypeConfiguration<Analytics>
    {
        public AnalyticsConfiguration()
        {
            HasKey(a => new { a.CountryId, a.ProductId });
        }
    }


С

public class AnalyticsConfiguration : EntityTypeConfiguration<Analytics>
    {
        public AnalyticsConfiguration()
        {
            HasKey(a => new { a.RepresnentativeName, a.DoctorName, a.CustomerCode, a.Specialization, a.ProductName });
        }
    }


Все остальные операторы кода одинаковы...


Maciej Los

Отметьте его как решение (зеленая кнопка), чтобы удалить ваш вопрос из списка без ответа.

Richard Deeming

Это довольно широкий ключ. Возможно, вам лучше создать суррогатный ключ вместо этого.

Amr Mohammad Rashad

Я завишу от другого представления при создании своего, и эти столбцы вместе образуют уникальный идентификатор для каждой строки в наборе строк!