我想构建一个结果,如: CategoryID ||计数(搜索)|| CategoryName 基于两个基于实体框架的类:
public class Category
{
// Primary properties
public int Id { get; set; }
public string Name { get; set; }
public string SearchPreviewControllerAction { get; set; }
}
public class Search
{
// Primary properties
public int Id { get; set; }
public string SearchTitle { get; set; }
public string SearchStandard { get; set; }
public int CategoryId { get; set; }
// Navigation properties
public virtual Category Category { get; set; }
}
我已经制作了一个SearchPreview方法,该方法基于像“阿斯顿马丁”这样的搜索返回搜索,这些搜索将在所有类别中找到“阿斯顿马丁”字样。
现在的挑战是建立一种方法,在搜索关键词“阿斯顿马丁”之后返回,其中包含计数的关键字类别,如“自动:2 |点数:3 |商店:2 “
我试图避免对每个类别的查询来计算搜索条目的数量,我想找到一个 GroupBy 解决方案,它已经执行了SearchPreview方法并提取了 GroupBy 它包含的类别。
我正在使用ViewModel SearchPreviewListCategoriesViewModel
使用Automapper从模型进行映射:
public class SearchPreviewListCategoriesViewModel
{
public int CategoryID { get; set; }
public string Name { get; set; }
public string SearchPreviewControllerAction { get; set; }
public int SearchCount { get; set; }
}
希望索索可以帮助我。
谢谢。
此致
帕特里克。
答案 0 :(得分:0)
不确定你是如何匹配的,但也许是这样的
from c in aCategories where c.Search.Any(s => s.SearchStandard.Contains("Aston Martin") == true) select new SearchPreviewListCategoriesViewModel { CategoryID = c.Id, Name = c.Name, SearchPreviewControllerAction = c.SearchPreviewControllerAction, SearchCount = (c.Search.Where(s => s.SearchStandard.Contains("Aston Martin") == true)).Count() };
其中aCategories是您对Category表的上下文访问权。
答案 1 :(得分:0)
发现问题的解决方案:
第1步:
创建数据传输对象以获取Domain对象并将其传递到Presentation Web Layer:
public class SearchCategoriesListDto
{
public int Id { get; set; }
public string Name { get; set; }
public string SearchPreviewControllerAction { get; set; }
public int SearchCount { get; set; }
}
第2步:
在表示层中重构DTO和ViewModel之间的映射:
Mapper.CreateMap<SearchCategoriesListDto, SearchCategoriesListViewModel>();
第3步:
提供CategoryName的方法,按类别计算的Count和将为每个类别列表提供列表的ControllerAction名称:
public IList<SearchCategoriesListDto> SearchPreviewCategories(String keywords)
{
string keywordsClean = keywords;
keywordsClean = keywordsClean.ToUpper();
keywordsClean = StringUtils.StringSimbolsRemove(keywordsClean, HeelpResources.StringSymbolsToCleanFrom, HeelpResources.StringSymbolsToCleanTo);
string[] splitKeywords = keywordsClean.Split(new Char[] { ' ' });
var searchQuery = _searchRepository.Query;
foreach (string keyword in splitKeywords)
{
searchQuery = searchQuery.Where(p => p.SearchStandard.Contains(keyword));
}
var categoryQuery = _categoryRepository.Query;
var query = from sq in searchQuery
join cq in categoryQuery on sq.CategoryId equals cq.Id
select new SearchCategoriesListDto {
Name = cq.Name,
SearchCount = searchQuery.Where(c => c.CategoryId == cq.Id).Count(),
SearchPreviewControllerAction = cq.SearchPreviewControllerAction
};
var searchResults = query.Distinct().ToList();
return searchResults;
}
感谢StackOverlow提供的所有帮助来解决这一挑战。