#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. Согласно предоставленному вами коду, разве вы уже не вернули коллекцию из двух разных объектов? Итак, каковы ваши конкретные потребности, пожалуйста, простите меня за то, что я не понимаю, что вы имеете в виду.