簡體   English   中英

MVC實體框架計數

[英]MVC Entity Framework Count

我想建立一個類似的結果: CategoryID || 計數(搜索)|| CategoryName基於兩個基於Entity Framework的類:

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”。

現在的挑戰是構建一種方法,該方法在搜索關鍵字“阿斯頓·馬丁”之后返回,其中的類別中包含那些包含計數在內的關鍵字,例如“自動: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; }
}

希望somoeone可以幫助我。

謝謝。

問候,

帕特里克

不確定您的匹配方式如何,但也許像這樣

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步:

創建一個數據傳輸對象以獲取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>();

第三步:

傳遞CategoryName,按類別計數和ControllerAction名稱的方法,該方法將傳遞每個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獲得的所有幫助來解決此難題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM