根据一组关键字进行搜索

Pat*_*ick 12 c# linq asp.net-mvc entity-framework

我需要根据一组关键字进行搜索,这些关键字会返回与这些关键字相关的所有广告.然后,结果是一个类别列表,其中包含每个类别的广告计数.

搜索在关键字搜索表中进行:

public class KeywordSearch
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Keyword Keyword { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

关键字表的位置是:

public class Keyword
{
    public int Id { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

广告与使用下表的关键字相关:

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; }
}
Run Code Online (Sandbox Code Playgroud)

最后,分类表:

public class Category
{
    public int Id { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

例:

  • 关键词:"梅赛德斯 - 奔驰"和"GLK"
  • 关键字搜索:"梅赛德斯"和"奔驰"为关键字"梅赛德斯 - 奔驰""GLK"为关键字"GLK"
  • 类别:"汽车"和"卡车"
  • 广告:汽车 - 梅赛德斯 - 奔驰GLK卡车 - 梅赛德斯 - 奔驰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()
                };
Run Code Online (Sandbox Code Playgroud)

问题是我无法获得与所有关键字匹配的广告.

编辑:

当关键字由2个或更多KeywordSearches(如"Mercedes-Benz")组成时,行"其中d.Count()== splitKeywords.Count()"失败,因为d.count = 1且splitkeywords.Count = 2表示"梅赛德斯 - 奔驰"

任何帮助?

Str*_*ior 0

我还没有编译检查这个或任何东西,所以它可能需要一些调整,但你正在寻找类似的东西。

var matchingKac = keywordIds.Distinct().ToList()
    .Aggregate(
        keywordAdCategoryQuery.AsQueryable(),
        (q, id) => q.Where(kac => kac.Keyword_Id == id));
Run Code Online (Sandbox Code Playgroud)

您实际上是在说:“从 开始keywordAdCategoryQuery,为每个关键字添加一个.Where()条件,表明其中必须包含该关键字。for如果您发现Aggregate难以阅读,您可以使用循环执行相同的操作。