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卡车 - 梅赛德斯 - 奔驰Citan
如果我搜索"梅赛德斯 - 奔驰",我会得到:
如果我搜索"Mercedes-Benz GLK",我会得到:
如果我搜索"Mercedes Citan",我会得到:
直到现在我得到的:
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表示"梅赛德斯 - 奔驰"
任何帮助?
我还没有编译检查这个或任何东西,所以它可能需要一些调整,但你正在寻找类似的东西。
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难以阅读,您可以使用循环执行相同的操作。
| 归档时间: |
|
| 查看次数: |
1694 次 |
| 最近记录: |