これらのキーワードに関連するすべての広告を返す一連のキーワードに基づいて検索を行う必要があります。結果は、各カテゴリの広告数を含むカテゴリのリストです。
検索は KeywordSearch テーブルで行われます。
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; }
}
最後に、カテゴリ テーブル:
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
}
例:
- キーワード: 「メルセデス・ベンツ」と「GLK」
- キーワード検索: キーワード「Mercedes-Benz」の場合は「Mercedes」と「Benz」、キーワード「GLK」の場合は「GLK」
- カテゴリ: 「乗用車」と「トラック」
広告: 車 - メルセデスベンツ GLK トラック - メルセデスベンツ シタン
「メルセデス・ベンツ」を検索すると、次のようになります。
- 車: 1
- トラック: 1
「Mercedes-Benz GLK」を検索すると、次のようになります。
- 車: 1
「メルセデス シタン」で検索すると、次のようになります。
- トラック: 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()
};
問題は、すべてのキーワードに一致する広告だけを取得できないことです。
編集:
「Mercedes-Benz」のようにキーワードが 2 つ以上の KeywordSearch で構成されている場合、「where d.Count() == splitKeywords.Count()」の行は失敗します。メルセデスベンツ"
ヘルプはありますか?