asp.net LinQ中GroupBy的用法

本人第一次写技术博客,如有错误之处,请指出,3Q!

共同学习,共同努力!!!

之前同事问了我一个问题,假如数据库里有一张表University(大学),表中有3列,分别是City(所在城市),Name(大学名称),Number(编号),如何将表中的数据先按照大学所在城市排序,再按照大学编号排序。其实这个问题很简单,如果写SQL语句肯定是要使用GroupBy分组函数进行分组。

其实最后我并没有推荐同事使用sql的方式实现,而是使用了LinQ中的GroupBy,代码简单,但是第一次编码的时候,还是出现了很多问题。


官方文档:http://msdn.microsoft.com/zh-cn/library/system.linq.enumerable.groupby(v=vs.110).aspx


University大学实体类:

    /// 
    /// 大学实体类
    /// 
    public class University
    {
        /// 
        /// 所在城市
        /// 
        public string City { get; set; }
        /// 
        /// 大学名称
        /// 
        public string Name { get; set; }
        /// 
        /// 编号
        /// 
        public int Number { get; set; }
    }


aspx.cs数据处理代码:

		List UniversityList = new List();
                UniversityList.Add(new University { City = "北京", Name = "北京大学", Number = 1 });
                UniversityList.Add(new University { City = "上海", Name = "同济大学", Number = 5 });
                UniversityList.Add(new University { City = "天津", Name = "南开大学", Number = 8 });
                UniversityList.Add(new University { City = "北京", Name = "清华大学", Number = 2 });
                UniversityList.Add(new University { City = "安徽", Name = "中国科技大学", Number = 10 });
                UniversityList.Add(new University { City = "北京", Name = "外国语大学", Number = 4 });
                UniversityList.Add(new University { City = "上海", Name = "交通大学", Number = 7 });
                UniversityList.Add(new University { City = "浙江", Name = "浙江大学", Number = 9 });
                UniversityList.Add(new University { City = "广东", Name = "暨南大学", Number = 12 });
                UniversityList.Add(new University { City = "上海", Name = "华东科技大学", Number = 6 });
                UniversityList.Add(new University { City = "北京", Name = "人民大学", Number = 3 });
                UniversityList.Add(new University { City = "广东", Name = "厦门大学", Number = 13 });
                UniversityList.Add(new University { City = "广东", Name = "中山大学", Number = 11 });

                //分组并排序
                var GroupList = UniversityList.GroupBy(x => x.City).OrderBy(x => x.Key);

                //下面这个集合是最终处理结果的集合
                List newList = new List();

                foreach (var university in GroupList)
                {
                    //将上面分组的集合转换为泛型集合,并再次按照Number排序
                    List tempList = university.ToList().OrderBy(x => x.Number).ToList();

                    /*
                     *以上代码也可以这样写 
                    *List tempList = university.ToList();
                    *tempList = tempList.OrderBy(x => x.Number).ToList();
                    */

                    foreach (University u in tempList)
                    {
                        newList.Add(u);
                    }
                }

                gvList.DataSource = newList;
                gvList.DataBind();


结果:

asp.net LinQ中GroupBy的用法_第1张图片

代码很容易理解,没有复杂的逻辑。

需要注意的是在分组排序时,大家可能注意到,我使用的var类型去接收的。


本人第一次编写时,犯了一个特大的错误,后来才知道GroupBy集合后,类型就发生了转变,变为一个带有key值得集合:IEnumerable>。


还有一点需要注意的是,当GroupBy后,再次OrderBy时,参数Lambda表达式只能调出一个属性,就是Key,这个属性实际上就是前面GroupBy中的属性。

你可能感兴趣的:(asp.net)