EF повторяющиеся значения во вторичной таблице

#c# #entity-framework #asp.net-core

#c# #entity-framework #asp.net-ядро

Вопрос:

Я разрабатываю веб-приложение с использованием Entity Framework.

Мне нужно выбрать и передать значения для an Ilist , но он возвращает повторяющиеся значения.

 IQueryable<establishmentInfo> filter = (from x in db.establishments
                                        join t in db.establishment_categories on x.id equals t.establishment
                                        join q in db.categories on t.category equals q.id
                                        where (x.name.ToUpper().Contains(search.ToUpper()))
                                        select new establishmentInfo
                                                   {
                                                       id = x.id,
                                                       name = x.name,
                                                       id_category = q.id,
                                                       category = q.name,
                                                    });

IList<establishmentInfo>establishments = filter.ToList();
   
  

Установочная таблица

 id    name        email
---------------------------
1     AAA         a@a.com
2     BBB         b@b.com
  

Establishment_categories

 id    establishment    category
-------------------------------
1          1               1
2          1               2
3          2               1
  

Категории

 id            name
---------------------
1             alpha
2             beta
  

Проблема в том, что возвращает 2 учреждения, одно с категорией 1, а другое с категорией 2. Мне нужно удалить одно из них.

Кто-нибудь может помочь?

Комментарии:

1. Причина, по которой у вас есть повторяющиеся Establishment s, заключается в том, что у вас есть две записи Establishment_category с establishment равными 1 . Вы понимаете, как join это работает?

2. Какую версию EF вы используете: EF 6.x / EF Core 2.0 / EF Core 2.1 / EF Core 3.x?

3. Итак, у вас есть много-много отношений, определенных вашей establishment_categories таблицей. В настоящее время ваш результирующий набор будет возвращать одну запись для каждого из этих многих-многих объединений. Поэтому, если вам нужна только одна запись для связи, вам нужно решить, какую из этих строк вы хотите исключить…

Ответ №1:

Как сказал @NetMage, ваш оператор linq должен возвращать два значения, которые не повторяются.

Мы видим, что в вашей таблице есть две записи с establishment установленным 1 Establishment_categories значением. Вы можете проверить свой establishments . id_category Должно быть 1 , category должно быть alpha , другое должно id_category быть 2 , и category должно быть beta .

Вы можете увидеть изображение ниже:

введите описание изображения здесь

Если вы хотите получить только первые данные учреждений, вы можете написать код следующим образом:

 IQueryable<Establishment>  filter = (from x in _context.Establishments
                     join t in _context.Establishment_Categories on x.Id equals t.EstablishmentId
                     join q in _context.Categories on t.CategoryId equals q.Id
                     where x.Name.ToUpper().Contains(search.ToUpper())
                     select new Establishment
                     {
                      Id = x.Id,
                      Name = x.Name,
                      CategoryId = q.Id,
                      CategoryName = q.Name,
                     }).Take(1);

        List<Establishment> establishments = filter.ToList();
  

Результат:
введите описание изображения здесь

Кстати, предполагая, что в ваших возвращаемых данных есть дубликаты, вы можете добавить .Distinct() метод после вашего linq для удаления дубликатов.

Комментарии:

1. Спасибо за вашу помощь. Я понимаю ваш комментарий, но в объяснении я не могу выполнить цикл foreach, потому что это не список. Я попытался использовать . Distinct() но я делаю что-то не так. Если я попробую фильтровать только учреждения и категории и выполню Distinct, я получу только тот результат, который я хочу. Я могу добавить другой фильтр внутри первого результата? Например, establishment_filter = establishment_filter ….

2. Согласно предоставленному вами коду, разве вы уже не вернули коллекцию из двух разных объектов? Итак, каковы ваши конкретные потребности, пожалуйста, простите меня за то, что я не понимаю, что вы имеете в виду.