我需要根据一组关键字进行搜索,返回与这些关键字相关的所有广告。然后结果是包含每个类别的广告计数的类别列表。
在 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 卡车 - 梅赛德斯-奔驰 Citan
如果我搜索“梅赛德斯-奔驰”,我会得到:
- 汽车:1
- 卡车:1
如果我搜索“梅赛德斯-奔驰 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 个或多个 KeywordSearches 组成时,例如“Mercedes-Benz”,“where d.Count() == splitKeywords.Count()”行会失败,因为 d.count = 1 和 splitkeywords.Count = 2 for "奔驰”
有什么帮助吗?