Мне нужно сделать поиск на основе набора ключевых слов, которые возвращают все объявления, связанные с этими ключевыми словами. Тогда результатом будет список категорий с количеством объявлений для каждой категории.
Поиск выполняется в таблице ключевых слов:
public class KeywordSearch
{
public int Id { get; set; }
public string Name { get; set; }
public Keyword Keyword { get; set; }
}
Если таблица ключевых слов:
public class Keyword
{
public int Id { get; set; }
public string Name { get; set; }
}
Объявления связаны с ключевыми словами, используя следующую таблицу:
public class KeywordAdCategory
{
[Key]
[Column("Keyword_Id", Order = 0)]
public int Keyword_Id { get; set; }
[Key]
[Column("Ad_Id", Order = 1)]
public int Ad_Id { get; set; }
[Key]
[Column("Category_Id", Order = 2)]
public int Category_Id { get; set; }
}
Наконец, таблица Category:
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
}
Пример:
- Ключевые слова: "Мерседес-Бенц" и "GLK"
- Ключевое словоПоиск: "Мерседес" и "Бенц" для ключевого слова "Мерседес-Бенц" "GLK" для ключевого слова "GLK"
- Категория: "Автомобили" и "Грузовики"
-
Объявления: Автомобиль - Mercedes-Benz GLK Грузовик - Mercedes-Benz Citan
Если я ищу "Мерседес-Бенц", я получаю:
- Автомобили: 1
- Грузовики: 1
Если я ищу "Mercedes-Benz GLK", я получаю:
- Автомобили: 1
Если я обыщу "Mercedes Citan", я получаю:
- Грузовики: 1
То, что я получаю до сих пор:
var keywordIds = from k in keywordSearchQuery
where splitKeywords.Contains(k.Name)
select k.Keyword.Id;
var matchingKac = from kac in keywordAdCategoryQuery
where keywordIds.Distinct().Contains(kac.Keyword_Id)
select kac;
var addIDs = from kac in matchingKac
group kac by kac.Ad_Id into d
where d.Count() == splitKeywords.Count()
select d.Key;
var groupedKac = from kac in keywordAdCategoryQuery
where addIDs.Contains(kac.Ad_Id) <--- EDIT2
group kac by new { kac.Category_Id, kac.Ad_Id };
var result = from grp in groupedKac
group grp by grp.Key.Category_Id into final
join c in categoryQuery on final.Key equals c.Id
select new CategoryGetAllBySearchDto
{
Id = final.Key,
Name = c.Name,
ListController = c.ListController,
ListAction = c.ListAction,
SearchCount = final.Count()
};
Проблема заключается в том, что я не могу получить только те объявления, которые соответствуют всем ключевым словам.
ИЗМЕНИТЬ:
Если ключевое слово составлено из 2 или более ключевых слов, таких как "Mercedes-Benz", строка "где d.Count() == splitKeywords.Count()" терпит неудачу, поскольку d.count = 1 и splitkeywords.Count = 2 для "Мерседес-Бенц"
Любая помощь?