1

我想建立一个类似的结果: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 方法,该方法基于“Aston Martin”之类的搜索返回搜索,该搜索将在所有类别中找到带有“Aston Martin”字样的搜索。

现在的挑战是构建一个方法,在搜索关键字“Aston Martin”之后返回,在哪些类别中有包括计数在内的关键字,例如“Auto: 2 | Seeling point: 3 | Shop: 2”

我试图避免对每个类别进行查询以计算 Searches 条目的数量,并且我想找到一个GroupBy解决方案,该解决方案采用已经执行的 SearchPreview 方法并提取它包含的GroupBy类别。

我正在使用 ViewModelSearchPreviewListCategoriesViewModel从使用 Automapper 的模型进行映射:

public class SearchPreviewListCategoriesViewModel
{
    public int CategoryID { get; set; }
    public string Name { get; set; }
    public string SearchPreviewControllerAction { get; set; }
    public int SearchCount { get; set; }
}

希望有人能在这方面帮助我。

谢谢你。

问候,

帕特里克。

4

2 回答 2

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 表的上下文访问。

于 2012-10-11T13:39:14.463 回答
0

发现问题的解决方法:

第1步:

创建数据传输对象以获取域对象并将其传递到表示 Web 层:

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 by Category 和 ControllerAction Name 的方法,将为每个 Category 列表传递列表:

    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 为我解决这一挑战提供的所有帮助。

于 2012-10-16T12:34:52.080 回答