ASP.NET MVC获取多级类别组合下的产品

 更新时间:2022年9月14日 13:12  点击:18 作者:Darren Ji

本篇是针对我在做项目过程中遇到的特定需求而做的一个Demo, 没有很大的通用性,读者酌情可绕行。

标题不能完全表达本意,确切的情景需要展开说。假设有三级分类,关于分类这样设计

    public class Category
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int ParentId { get; set; }
    }

然后产品可以属于多个分类,以下的Categories属性值是以英文逗号隔开、由分类编号拼接而成的字符串。

    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Categories { get; set; }
    }

由于种种原因,Categories属性值只是存储了由第三级分类编号拼接而成的字符串。

在前端,需要把分类作为查询条件来查询产品,可能只选择一级分类,把一个数字字符串(比如"1")发送给服务端;可能同时选择一级和二级分类,也把一个数字字符串(比如"1,2")发送给服务端;当然,也有可能同时选择一级、二级和三级分类作为查询条件(比如"1,2,3")。换句话说,如果诸如"1"或"1,2"或"1,2,3"这样的查询条件转换成数组后,如果数组的每一个元素都被包含在Product的Categories属性值转换成的数组中,那这个产品就符合搜索条件。

简单来说,是这样:假设搜索条件是"1,2",Product的Categories属性值为"1,3,2,5",我们不是判断"1,2"这个字符串是否包含在"1,3,2,5"字符串中,而是把"1,2"先split成数组,叫做array1, 把"1,3,2,5"也split成数组,叫做array2,最后判断array1的每个元素是否都被包含在array2中。

还有一个问题需要解决:当前的Product的Categories属性值只存储了所有第三级分类编号拼接成的字符串,而前端输入的搜索条件可能会包含一级分类或二级分类等,所以,我们需要把Product转换一下,希望有一个类的某个属性值能存储由一级、二级、三级分类拼接而成的字符串。

    public class ProductWithThreeCate
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string AllCategoreis { get; set; }
    }

以上, AllCategoreis属性值就用来存储由一级、二级、三级分类拼接而成的字符串。

有一个方法获取所有分类:

        static List<Category> GetCategories()
        {
            return new List<Category>()
            {
                new Category(){Id = 1, Name = "根", ParentId = -1},
                new Category(){Id = 2, Name = "一级分类1",ParentId = 1},
                new Category(){Id = 3, Name = "一级分类2", ParentId = 1},
                new Category(){Id = 4, Name = "二级分类11",ParentId = 2},
                new Category(){Id = 5, Name = "二级分类12",ParentId = 2},
                new Category(){Id = 6, Name = "二级分类21",ParentId = 3},
                new Category(){Id = 7, Name = "二级分类22",ParentId = 3},
                new Category(){Id = 8, Name = "三级分类111",ParentId = 4},
                new Category(){Id = 9, Name = "三级分类112",ParentId = 4},
                new Category(){Id = 10, Name = "三级分类121",ParentId = 5},
                new Category(){Id = 11, Name = "三级分类122",ParentId = 5},
                new Category(){Id = 12, Name = "三级分类211",ParentId = 6},
                new Category(){Id = 13, Name = "三级分类212",ParentId = 6},
                new Category(){Id = 14, Name = "三级分类221",ParentId = 7}
            };
        }

有一个方法获取所有产品:

        static List<Product> GetProducts()
        {
            return new List<Product>()
            {
                new Product(){Id = 1, Name = "产品1",Categories = "10,12"},
                new Product(){Id = 2, Name = "产品2", Categories = "12,13"},
                new Product(){Id = 3, Name = "产品3",Categories = "10,11,12"},
                new Product(){Id = 4, Name = "产品4",Categories = "13,14"},
                new Product(){Id = 5, Name = "产品5",Categories = "11,13,14"}
            };
        }

接下来的方法是根据搜索条件(比如是"1,2")来查找满足条件的ProductWithThreeCate集合,如下:

        /// <summary>
        /// 获取满足某些条件的集合
        /// </summary>
        /// <param name="query">以英文逗号隔开的字符串,比如:2,5</param>
        /// <returns></returns>
        static List<ProductWithThreeCate> GetResultByQuery(string query)
        {
            //最终结果
            List<ProductWithThreeCate> result = new List<ProductWithThreeCate>();
            //临时结果 此时ProductWithThreeCat的属性AllCategoreis包含所有一级、二级、三级分类ID拼接成的字符串
            List<ProductWithThreeCate> tempResult = new List<ProductWithThreeCate>();
            //获取所有的产品
            List<Product> allProducts = GetProducts();
            //遍历这些产品
            foreach (var item in allProducts)
            {
                ProductWithThreeCate productWithThreeCate = new ProductWithThreeCate();
                productWithThreeCate.Id = item.Id;
                productWithThreeCate.Name = item.Name;
                //所有一级、二级、三级拼接成以英文逗号隔开的字符串
                string temp = string.Empty;
                //当前产品只包含三级拼接成的、也是以英文隔开的字符串,split成数组
                string[] theThirdCates = item.Categories.Split(',');
                //遍历这些三级数组
                foreach (string i in theThirdCates)
                {
                    //三级类别转换成整型
                    int theThirdInt = int.Parse(i);
                    //获取三级类别
                    Category theThirdCate = GetCategories().Where(c => c.Id == theThirdInt).FirstOrDefault();
                    //获取二级类别
                    Category theSecondCate = GetCategories().Where(c => c.Id == theThirdCate.ParentId).FirstOrDefault();
                    //获取一级类别
                    Category theFirstCate = GetCategories().Where(c => c.Id == theSecondCate.ParentId).FirstOrDefault();
                    temp += i + "," + theSecondCate.Id.ToString() + "," + theFirstCate.Id.ToString() + ",";
                }
                //去掉最后一个英文逗号
                temp = temp.Substring(0, temp.Length - 1);
                //转换成集合,去除重复项,比如不同的三级可能有相同的一级或二级父类
                IEnumerable<string> tempArray = temp.Split(',').AsEnumerable().Distinct();
                //所有一级、二级、三级拼接成以英文逗号隔开的字符串,但已经去除了重复的一级和二级
                string tempagain = string.Empty;
                //再次遍历集合拼接成字符串
                foreach (var s in tempArray)
                {
                    tempagain += s + ",";
                }
                productWithThreeCate.AllCategoreis = tempagain.Substring(0, tempagain.Length - 1);
                tempResult.Add(productWithThreeCate);
            }
            //遍历临时结果
            foreach (var item in tempResult)
            {
                //把当前包含一级、二级、三级的,以英文逗号隔开的字符串split成数组
                string[] itemArray = item.AllCategoreis.Split(',');
                //把当前查询字符串split成数组
                string[] queryArray = query.Split(',');
                //如果queryArray的每一个元素都被包含在itemArray中,那就保存起来
                if (queryArray.All(x => itemArray.Contains(x)) == true)
                {
                    result.Add(item);
                }
            }
            return result;
        }                

客户端的调用如下:

            List<ProductWithThreeCate> result = GetResultByQuery("2,5");
            //遍历最终的结果
            foreach (var item in result)
            {
                Console.WriteLine(item.Name+ "  " + item.AllCategoreis);
            }
            Console.ReadKey(); 

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对猪先飞的支持。如果你想了解更多相关内容请查看下面相关链接

原文出处:https://www.cnblogs.com/darrenji/p/4267926.html

相关文章

  • ASP.NET购物车实现过程详解

    这篇文章主要为大家详细介绍了ASP.NET购物车的实现过程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
  • SpringMvc获取请求头请求体消息过程解析

    这篇文章主要介绍了SpringMvc获取请求头请求体消息过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-17
  • Asp.net动态生成html页面的方法分享

    这篇文章介绍了Asp.net动态生成html页面的方法,有需要的朋友可以参考一下...2021-09-22
  • asp.net中XML如何做增删改查操作

    工作之余,温习一下对xml的简单操作,抽个时间把asp.net XML增删改查操作方法分享给大家,需要的朋友可以参考下...2020-06-25
  • 深入学习.net验证码生成及使用方法

    这篇文章主要介绍了.net验证码生成及使用方法,先了解验证码是什么以及其作用,最后分享了如何制作验证码,内容很全面,感兴趣的小伙伴们可以参考一下...2021-09-22
  • 详解EFCore中的导航属性

    这篇文章主要介绍了详解EFCore中的导航属性的相关资料,帮助大家更好的理解和学习使用ASP.NET CORE,感兴趣的朋友可以了解下...2021-09-22
  • ASP.NET Core使用JWT认证授权的方法

    这篇文章主要介绍了ASP.NET Core使用JWT认证授权的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • ASP.NET连接MySql数据库的2个方法及示例

    这篇文章主要介绍了ASP.NET连接MySql数据库的2个方法及示例,使用的是MySQL官方组件和ODBC.NET,需要的朋友可以参考下...2021-09-22
  • ASP.NET Core如何注入多个服务实现类

    这篇文章主要介绍了ASP.NET Core如何注入多个服务实现类的相关资料,需要的朋友可以参考下面文章的具体内容...2021-09-22
  • Asp.net中获取DataTable选择第一行某一列值

    这篇文章主要介绍了获取DataTable选择第一行某一列值,需要的朋友可以参考下...2021-09-22
  • asp.net反射简单应用实例

    这篇文章主要介绍了asp.net反射简单应用,结合完整实例形式分析了asp.net反射的原理与简单使用方法,需要的朋友可以参考下...2021-09-22
  • 详解ASP.NET配置文件Web.config

    这篇文章主要介绍了ASP.NET配置文件Web.config,Web.config是asp.net应用程序中一个很重要的配置文件,需要的朋友可以参考下...2021-09-22
  • asp.net实现DataList与Repeater嵌套绑定的方法

    这篇文章主要介绍了asp.net实现DataList与Repeater嵌套绑定的方法,结合实例形式分析了DataList与Repeater的步骤与相关实现技巧,需要的朋友可以参考下...2021-09-22
  • C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?

    这篇文章主要介绍了C# MVC模式中应该怎样区分应用程序逻辑(Controller层)和业务逻辑(Model层)?,这也小编做.NET项目时经常思考和让人混乱的一个问题,这篇文章写的挺好,一下清晰了许多,需要的朋友可以参考下...2020-06-25
  • ASP.NET Core MVC如何实现运行时动态定义Controller类型

    这篇文章主要介绍了ASP.NET Core MVC如何实现运行时动态定义Controller类型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • .NET Core如何获取操作系统中的各种信息

    .net core是最近讨论频率很高的话题,下面这篇文章主要给大家介绍了关于利用.NET Core如何获取操作系统中各种信息的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧...2021-09-22
  • 详解ASP.NET Core Token认证

    这篇文章主要介绍了详解ASP.NET Core Token认证,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2021-09-22
  • SpringMvc自动装箱及GET请求参数原理解析

    这篇文章主要介绍了SpringMvc自动装箱及GET请求参数原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-19
  • asp.net实现Gradview绑定数据库数据并导出Excel的方法

    这篇文章主要介绍了asp.net实现Gradview绑定数据库数据并导出Excel的方法,涉及asp.net操作Gradview实现数据库绑定及数据导出的相关技巧,非常简单实用,需要的朋友可以参考下...2021-09-22
  • ASP.NET MVC API 接口验证的示例代码

    本篇文章主要介绍了ASP.NET MVC API 接口验证的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2021-09-22