C# 类别-使用dapper和SQL Server列出的子类别

C# 类别-使用dapper和SQL Server列出的子类别,c#,sql-server,asp.net-core,dapper,C#,Sql Server,Asp.net Core,Dapper,我有一个要求,其中有两个实体:类别和书签。类别可以包含一些子类别和/或一些书签。我的表格结构如下所示: TBL分类 ID int PK, Name nvarchar CategoryID int (foreignKey) BookmarkID int (foreignKey) tblBookmarks ID int PK Name nvarchar tblBookmarkCategories ID int PK, Name nvarchar CategoryID int (foreign

我有一个要求,其中有两个实体:
类别
书签
。类别可以包含一些子类别和/或一些书签。我的表格结构如下所示:

TBL分类

ID int PK,
Name nvarchar
CategoryID int (foreignKey)
BookmarkID int (foreignKey)
tblBookmarks

ID int PK
Name nvarchar
tblBookmarkCategories

ID int PK,
Name nvarchar
CategoryID int (foreignKey)
BookmarkID int (foreignKey)
同样,我的实体如下所示:

public class CategoryTree
{
    public int ID { get; set; }
    public string Name { get; set; }
    public ICollection<CategoryTree> SubCategory { get; set; }
    public ICollection<Bookmark> Bookmarks { get; set; }
}

public class Bookmark
{
    public int ID { get; set; }
    public string Name { get; set; }
}

由于类别和子类别也包含关系,您可以在“tblCategories”表中添加“ParentID”列,通过使用它,您可以根据“ParentID”列找到子类别,如下所示:

Dapper用于从数据库查询数据,我更喜欢一次加载所有类别和书签,然后根据类别查找子类别和书签

因此,我创建了以下类:

public class Category
{
    public int ID { get; set; }
    public string Name { get; set; }
    public int ParentID { get; set; }

    public virtual ICollection<Category> SubCategories { get; set; }
    public virtual ICollection<Bookmark> Bookmarks { get; set; }
}

public class Bookmark {
    public int ID { get; set; }
    public string Name { get; set; }
    public int CategoryID { get; set; }
}
公共类类别
{
公共int ID{get;set;}
公共字符串名称{get;set;}
public int ParentID{get;set;}
公共虚拟ICollection子类别{get;set;}
公共虚拟ICollection书签{get;set;}
}
公共类书签{
公共int ID{get;set;}
公共字符串名称{get;set;}
public int CategoryID{get;set;}
}
要获取/显示类别及其子类别,我们可以使用递归方法检查当前类别是否包含子类别,如果它包含子类别,则从类别列表中过滤数据。详细代码如下:

    public class HomeController : Controller
    { 
        private readonly IConfiguration _configuration; 
        public HomeController(IConfiguration configuration)
        { 
            _configuration = configuration;
        } 
        //Index page, display the categories and bookmarks
        public IActionResult DapperIndex()
        {
            //get the connection string
            var connectionstring = _configuration.GetConnectionString("DefaultConnection");

            //get all categories and bookmarks
            List<Category> allcategories = new List<Category>();
            using (SqlConnection connection = new SqlConnection(connectionstring))
            {
                allcategories = connection.Query<Category>("SELECT * FROM tblCategories").ToList(); 

            }
            List<Bookmark> allbookmarks = new List<Bookmark>();
            using (SqlConnection connection = new SqlConnection(connectionstring))
            {
                allbookmarks = connection.Query<Bookmark>("select b.Id, b.Name, bc.CategoryID from tblBookmarks as b join tblBookmarkCategories as bc on b.id = bc.BookmarkID").ToList();

            }
            List<Category> categories = allcategories
                .Where(e => e.ParentID == 0) /* grab only the root parent nodes */
                .Select(e => new Category
                {
                    ID = e.ID,
                    Name = e.Name,
                    ParentID = e.ParentID,
                    SubCategories = GetSubCategory(allcategories,allbookmarks, e.ID), /* Recursively grab the children */
                    Bookmarks = GetBookmarks(allbookmarks, e.ID)
                }).ToList();

            ViewBag.categoriesList = categories;
            return View();
        }
        //get the subcategories
        private static List<Category> GetSubCategory(List<Category> items, List<Bookmark> bookmarks, int parentId)
        {
            return items.Where(x => x.ParentID == parentId)
                .Select(e => new Category
                {
                    ID = e.ID,
                    Name = e.Name,
                    ParentID = e.ParentID,
                    SubCategories = GetSubCategory(items,bookmarks, e.ID),
                    Bookmarks = GetBookmarks(bookmarks,e.ID) 
                }).ToList();
        }
        //get the bookmarks.
        public static List<Bookmark> GetBookmarks(List<Bookmark> bookmarks, int categoryid)
        {
            return bookmarks.Where(c => c.CategoryID == categoryid).Select(e=> new Bookmark()
            {
                ID= e.ID,
                Name = e.Name,
                CategoryID = e.CategoryID
            }).ToList();
        } 
    }
公共类HomeController:控制器
{ 
专用只读IConfiguration\u配置;
公共家庭控制器(IConfiguration配置)
{ 
_配置=配置;
} 
//索引页面,显示类别和书签
公共IActionResult DapperIndex()
{
//获取连接字符串
var connectionstring=_configuration.GetConnectionString(“DefaultConnection”);
//获取所有类别和书签
List allcategories=新列表();
使用(SqlConnection连接=新的SqlConnection(connectionstring))
{
allcategories=connection.Query(“从tblCategories中选择*).ToList();
}
List allbookmarks=新列表();
使用(SqlConnection连接=新的SqlConnection(connectionstring))
{
allbookmarks=connection.Query(“从tblBookmarks中选择b.Id、b.Name、bc.CategoryID作为b.Id=bc.BookmarkID将tblBookmarkCategories作为bc连接到b.Id=bc.BookmarkID”).ToList();
}
列表类别=所有类别
.Where(e=>e.ParentID==0)/*仅获取根父节点*/
.选择(e=>新类别
{
ID=e.ID,
Name=e.Name,
ParentID=e.ParentID,
SubCategories=GetSubCategory(所有类别、所有书签、e.ID),/*递归地抓取子类别*/
Bookmarks=GetBookmarks(所有书签,e.ID)
}).ToList();
ViewBag.categoriesList=类别;
返回视图();
}
//获取子类别
私有静态列表GetSubCategory(列表项、列表书签、int parentId)
{
返回项。其中(x=>x.ParentID==ParentID)
.选择(e=>新类别
{
ID=e.ID,
Name=e.Name,
ParentID=e.ParentID,
SubCategories=GetSubCategory(项目、书签、e.ID),
Bookmarks=GetBookmarks(书签,e.ID)
}).ToList();
}
//去拿书签。
公共静态列表GetBookmarks(列表书签,int categoryid)
{
返回书签。其中(c=>c.CategoryID==CategoryID)。选择(e=>newbookmark()
{
ID=e.ID,
Name=e.Name,
CategoryID=e.CategoryID
}).ToList();
} 
}
.cshtml页面中的代码:

    @{ 
        List<Category> categorylist = ViewBag.categoriesList as List<Category>;
        void ShowTree(List<Category> categories)
        {
            if (categories != null)
            {
                foreach (var item in categories)
                {
                    <li>
                        <span>@item.Name</span>
                        @*display the bookmarks*@
                        @if (item.Bookmarks.Any())
                        {
                            foreach (var mark in item.Bookmarks)
                            {

                                <ul> @mark.Name  </ul>
                            }
                        }
                        @*display the subcategories*@
                        @if (item.SubCategories.Any())
                        {
                            <ul>
                                @{ ShowTree(item.SubCategories.ToList());}
                            </ul>
                        }
                    </li>
                }
            }
        }
        ShowTree(categorylist);
    }
@{
List categorylist=ViewBag.categoriesList作为列表;
void ShowTree(列出类别)
{
如果(类别!=null)
{
foreach(类别中的var项目)
{
  • @项目名称 @*显示书签*@ @if(item.Bookmarks.Any()) { foreach(item.Bookmarks中的var标记) {
      @mark.Name
    } } @*显示子类别*@ @if(item.SubCategories.Any()) {
      @{ShowTree(item.SubCategories.ToList());}
    }
  • } } } ShowTree(分类列表); }
    结果如下:

        public class HomeController : Controller
        { 
            private readonly IConfiguration _configuration; 
            public HomeController(IConfiguration configuration)
            { 
                _configuration = configuration;
            } 
            //Index page, display the categories and bookmarks
            public IActionResult DapperIndex()
            {
                //get the connection string
                var connectionstring = _configuration.GetConnectionString("DefaultConnection");
    
                //get all categories and bookmarks
                List<Category> allcategories = new List<Category>();
                using (SqlConnection connection = new SqlConnection(connectionstring))
                {
                    allcategories = connection.Query<Category>("SELECT * FROM tblCategories").ToList(); 
    
                }
                List<Bookmark> allbookmarks = new List<Bookmark>();
                using (SqlConnection connection = new SqlConnection(connectionstring))
                {
                    allbookmarks = connection.Query<Bookmark>("select b.Id, b.Name, bc.CategoryID from tblBookmarks as b join tblBookmarkCategories as bc on b.id = bc.BookmarkID").ToList();
    
                }
                List<Category> categories = allcategories
                    .Where(e => e.ParentID == 0) /* grab only the root parent nodes */
                    .Select(e => new Category
                    {
                        ID = e.ID,
                        Name = e.Name,
                        ParentID = e.ParentID,
                        SubCategories = GetSubCategory(allcategories,allbookmarks, e.ID), /* Recursively grab the children */
                        Bookmarks = GetBookmarks(allbookmarks, e.ID)
                    }).ToList();
    
                ViewBag.categoriesList = categories;
                return View();
            }
            //get the subcategories
            private static List<Category> GetSubCategory(List<Category> items, List<Bookmark> bookmarks, int parentId)
            {
                return items.Where(x => x.ParentID == parentId)
                    .Select(e => new Category
                    {
                        ID = e.ID,
                        Name = e.Name,
                        ParentID = e.ParentID,
                        SubCategories = GetSubCategory(items,bookmarks, e.ID),
                        Bookmarks = GetBookmarks(bookmarks,e.ID) 
                    }).ToList();
            }
            //get the bookmarks.
            public static List<Bookmark> GetBookmarks(List<Bookmark> bookmarks, int categoryid)
            {
                return bookmarks.Where(c => c.CategoryID == categoryid).Select(e=> new Bookmark()
                {
                    ID= e.ID,
                    Name = e.Name,
                    CategoryID = e.CategoryID
                }).ToList();
            } 
        }
    


    编辑:要在Asp.net核心应用程序中使用Dapper,请通过NuGet安装“Dapper”,然后检查。

    您无法显示Dapper的任何内容。衣冠楚楚是一种怪兽。您显示的代码中缺少一些东西:数据库中如何定义类别-子类别关系?