• linq学习笔记


       最近在学习linq的一些基础知识,看了c#高级编程及阅读了园子内部几篇优秀的博文,有所体会,感觉应该记录下来,作为以后复习使用。都是一些最基础的知识,大致分为三个部分:linq预备知识;linq查询;linq to sql。新手可以看看,大牛可以指点指点,谢谢了。

    一、linq预备知识:

    1、隐式类型

      在隐式类型出现之前,做法是

    int a = 10;
    string str = "abc";

      使用隐式类型,代码如下:

    var a = 10;
    var str = "abc";

      并不用担心使用var会影响其性能,因为int和var翻译成中间语言是一样的。

    2、匿名类型

    var obj = new { id = 2, name = "tom" };
                Console.WriteLine(obj.name);

      上述代码中,匿名定义来一个类型,并构建对象obj,之后可以直接调用它的属性而不必担心任何其他的问题。

    3、自动属性

    以前为一个类定义属性:

    private string name;
            public string Name
            {
                get { return name; }
                set { name = value; }
            }

    c#3.0使用自动实现的属性:

    public string Name { get; set; }

    4、扩展方法

    很多时候大家需要对CLR类型进行一些操作,苦于无法扩展CLR类型的方法,只能创建一个helper方法或者是子类,扩展方法使得这些需求得以实现。具体实例如下:

    //非嵌套、非泛型的静态类
        public static class EntendMethod
        {
            //静态方法、至少有一个参数、第一个参数必须附加this作为前缀、第一个参数不能有其他修饰符
            public static void PrintString(this String val)
            {
                Console.WriteLine(val);
            }
        }

    调用扩展方法:

    var str = "aaa";
    str.PrintString();//调用扩展方法

    5、对象初始化器

    非常简单,看具体实例即可明白,代码如下:

    public class Student
        {
            public int ID { get; set; }
            public string Name { get; set; }
            public int Age { get; set; }
        }
    
    
    //用对象初始化器方式
                List<Student> students = new List<Student>();
                students.Add(new Student { ID = 1, Name = "tom", Age = 21 });
                students.Add(new Student { ID = 2, Name = "tom2", Age = 22 });
                students.Add(new Student { ID = 3, Name = "tom3", Age = 23 });

    6、集合初始化器

    同样使用上述的Student类:

    //用集合初始化器方式
                List<Student> students2 = new List<Student> {
                    new Student {ID = 1, Name = "tom", Age = 21},
                    new Student {ID = 2, Name = "tom2", Age = 22},
                    new Student {ID = 3, Name = "tom3", Age = 23}
                };

    7、其它一些简单的基础知识:

    委托、泛型委托、匿名方法、Lambda表达式,请查看委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式

    二、linq查询

    1、基本查询

    使用上述的集合students,进行简单查询:

    //简单查询
                var studentSelect = from s in students
                                    where s.Age > 22
                                    select s;
                foreach (var s in studentSelect)
                {
                    Console.WriteLine(s.Name + ":" + s.Age);
                }

    2、生成一个新的类型对象

    //构建新对象
                var items = from s in students
                           select new
                               {
                                   bianhao = s.ID,
                                   nianlian = s.Age
                               };
                foreach (var item in items)
                {
                    Console.WriteLine(item.bianhao + ":" + item.nianlian );
                }

    3、使用where筛选进行查询

    实例可以使用上述(2)的实例继续进行:

    var items = from s in students
                            where s.ID > 1
                           select new
                               {
                                   bianhao = s.ID,
                                   nianlian = s.Age
                               };
                foreach (var item in items)
                {
                    Console.WriteLine(item.bianhao + ":" + item.nianlian );
                }

    4、使用索引筛选

    但是有些时候不能使用linq查询,其中在处理Where()方法的重载的时候便不可以,此时采用index进行,代码如下:

    var items2 = students
                    .Where((r, index) => r.ID != 5 && index % 2 != 0);
                foreach (var item in items2)
                {
                    Console.WriteLine(item.ID + " " + item.Name );
                }

    5、类型筛选

    object[] objs = { "a", 2, 4, "b", 9, "d" };
                var item3 = objs.OfType<int>();
                foreach (var item in item3)
                {
                    Console.WriteLine(item);
                }

    6、复合的from子句

    linq在查询时可以使用from子句进行套用

    7、排序

    orderby s.ID descending,具体实例如下:

    var items4 = from s in students
                                    where s.Age > 22
                                    orderby s.ID descending 
                                    select s;
                foreach (var s in items4)
                {
                    Console.WriteLine(s.Name + ":" + s.Age);
                }
    var items5 = students.OrderBy(r => r.Age);//升序
                var items6 = students.OrderByDescending(r => r.Age);//降序
                foreach (var s in items5)
                {
                    Console.WriteLine(s.Name + ":" + s.Age);
                }

    8、聚合操作符

    Count()、Sum Min Max Average Aggregate 不返回一个序列,而返回一个值。举例如下:

    int[] nums = new int[] { 1, 2, 3, 5, 12, 18, 23 };
                var num = from n in nums
                          select n;
                int result = num.Sum();
                Console.WriteLine(result);
    
                var items7 = from s in students
                             select s;
                var itemValue = items7.Max(m => m.Age);
                Console.WriteLine(itemValue);

    三、linq to sql

    对linq to sql一直没有搞清楚是怎么回事,就把自己对它的理解记录下来,待以后如果有更深入的认识时再行更正把。

    打开服务器资源管理器,将下列数据表添加进去。如下:

    简单解释:数据库表Guest是客人的ID、姓名、年龄、房间ID(Room表的R_ID),Room表有ID、名称、价格。

    查询房间价格大于28的房间的名称及价格:

    public void SelectRoom()
            {
                HotelDataContext db = new HotelDataContext();
                var rooms = from r in db.Room
                            where r.R_Price > 28
                            select r;
    
                foreach (var r in rooms)
                {
                    Console.WriteLine("RoomName:" + r.R_Name + "  Room Price:" + r.R_Price);
                }
            }

    联表查询:查询客人的姓名、年龄、房间名称、价格,代码如下:

    public void SelectGuestRoomInfo()
            {
                HotelDataContext db = new HotelDataContext();
    
                var guestInfo = from g in db.Guest
                                join r in db.Room on g.G_RoomID equals r.R_ID
                                select new
                                {
                                    name = g.G_Name,
                                    age = g.G_Age,
                                    roomName = r.R_Name,
                                    price = r.R_Price,
                                };
    
                foreach (var g in guestInfo)
                {
                    Console.WriteLine("name:" + g.name + " age:" + g.age + " roomName:" + g.roomName + " price:" + g.price);
                }
            }

    到此结束,以后如有深入的理解再行更改添加。

  • 相关阅读:
    Go从入门到精通——Go语言中程序文件的组织方法
    Go从入门到精通——怎样查看 Go 语言的文档
    AU篇——处理人声混BGM_(尽可能)去BGM提取人声
    【漏洞分析】DDOS攻防分析(一)——DNS篇
    【网络安全设备系列】15、安全网关/统一威胁管理(UTM)
    【网络安全设备系列】14、堡垒机
    【网络安全设备系列】13、网页防篡改
    【网络安全设备系列】12、态势感知
    【网络安全设备系列】11、抗DDOS设备
    【网络安全设备系列】10、安全审计系统
  • 原文地址:https://www.cnblogs.com/ysyn/p/4326303.html
Copyright © 2020-2023  润新知