第三十三讲 初窥LINQ

主要内容:
    概述
        1. LINQ起源
            1. LINQ-语言集成查询(Language Intergrated Query 简称LINQ)
            2. LINQ定义了大约40个查询操作符,如select,form,in,where以及order by。
            3. LINQ是一种能够快速对大部分数据源进行访问和数据整合的一种技术,使用相同的基本查询表达式模式来查询和转换SQL数据库,ADO.NET数据集,XML文档和流,以及.NET集合中的数据。
            4. LINQ通过对象的方式对数据库进行描述。
            
            
        2. LINQ架构
            1. LINQ从.NET3.5开始被引入
            2. LINQ to Objects
            3. LINQ to DataSet
            4. LINQ to SQL
            5. LINQ to Entities
            6. LINQ to XML
            已经生成截图
            
        3. LINQ相关的命名空间
            已经生成截图
            
        4. 简单的示例--查询并筛选数组
        
    查询表达式基础
        1. 查询概念和用途
            查询的对象为IEnumerable<T> 或 IQueryable<T> 集合
            
            实例操作
                排序、
                类型转换、
                查询数据源的单一值(最大,最小,总数......)
                
        2. 查询表达式语法
            1. 查询表达可用于查询和转换来自任意支持LINQ的数据源中的数据
            2. 在您循环访问foreach语句中的查询变量之前,不会执行查询
            3. 查询表达式中的变量都是强类型的,但许多情况下你不需要显示提供类型,因为编译器可以推断类型。
            
            语法:
            Var 查询变量=
                from 临时变量 in 数据源
                where 条件语句(where, orderby, join, from子句)
                select 查询目标

               

我个人百度收集了一些相关的基础知识,那个排序就跟SQL里的一个ASC,DESC只是在Linq中不是简写了,要全写

升序就是Ascending,而降序就是Descending。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.Web.Security;

namespace Con33
{
    
    class Program
    {
        /// <summary>
        /// Linq入门
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //创建一个数组
            string[] strArray = new string[] { "我", "中华", "人民", "共和国", "老虎苍蝇", "一起打" };
            //使用Linq语法
            var str1 = from s in strArray
                       //卧槽,这里声明查寻变量必须要用var吗?看了下面的才知道原来是懒敲IEnumerable<T>
                       select string.Format("这个字符串是:{0}", s);

            IEnumerable<string> str2 = from s in strArray
                                       //卧槽,原来系酱子,即将数组的元素存到一个泛型集合中去
                                       select string.Format("这个字符串是:{0}", s);

            //遍历查寻结果1
            foreach (var s in str1) //注意这个是泛型str1
            {
                Console.WriteLine(s);
            }

            Console.WriteLine("\n=======以下是同样的结果========\n");

            //遍历查寻结果2
            foreach (var s in str2)//注意这个是泛型str2
            {
                Console.WriteLine(s);
            }

            Console.WriteLine("\n=======排序看看========\n");
            //再写个数据组,排序看看
            int[] integrate = new[] {6,5,4,9,8,0,2,1,3,7 };
            var res = from r in integrate
                      orderby r descending //降序,而 ascending是升序
                      select string.Format("-----{0}-----",r);
            foreach (var v in res)
            {
                Console.WriteLine(v);
            }

            Console.WriteLine("\n=======扩展方法测试========\n");
            Console.WriteLine("1".In(new[] { "1", "2", "3" }));

            Console.WriteLine("\n=======匿名类型数据测试========\n");
            var data = new {a="1",b="2" };//光秃秃的也没有类名
            Console.WriteLine("匿名类中的a= {0},\n匿名中的b= {1}",data.a,data.b);

            Console.WriteLine("\n=======类的自动属性测试========\n");
            Person p = new Person();
            Console.WriteLine("Person类中自动属性username的值是{0}",p.username);

            Console.WriteLine("\n=======对象初始化器测试========\n");
            ObjectInit o = new ObjectInit() { name1 = "看到我了吗?" };
            Console.WriteLine(o.ToString());

            Console.WriteLine("\n=======集合初始化器测试========\n");
            var str = new List<object> {
                new ObjectInit{name1="集合初始化测试一次"},
                new ObjectInit{name1="集合初始化测试二次"},
                new ObjectInit{name1="集合初始化测试三次"}
            };

            foreach (var a in str)
            {
                Console.WriteLine(a.ToString());
            }

            Console.WriteLine("\n=======Lambda表达式测试========\n");
            var lam = new [] {"ab","ac","cd","edab" };
            //使用Array的FindAll方法从一个数组中查寻匹配的字符串
            var result = Array.FindAll(lam, s => (s.IndexOf('a') > 0));//语法:(参数列表)=>(表达式或语句块)
            foreach (var v in result)
            {
                Console.WriteLine("找到的匹配字符串是:{0}",v);
            }

            //多参数的Lambda表达式
            Console.WriteLine("\n=======Lambda表达式多参数测试========\n");
            //对于我们这些个初始学者来说,刚接触能似懂非懂很不错了,我这是在比葫芦画瓢的节奏,顺便写一些自己的理解
            Console.WriteLine((1.Oper(2,(a,b)=>(a+b))).ToString());//这我里用toSting(),其实不用也行,看下面
            Console.WriteLine(3.Oper(5,(c,d)=>(c-d)));//Lambda表达式表现的就是匿名方法的使用

            Console.WriteLine("\n=======让我更郁闷的Lambda表达式测试========\n");
            var str3 = new List<object> {
                new ObjectInit{name1="集合初始化测试一次"},
                new ObjectInit{name1="集合初始化测试二次"},
                new ObjectInit{name1="集合初始化测试三次000"}
            };

            var rs = from a in str3 //Linq表达的写法
                     where a.ToString().IndexOf("一") > 0
                     select a.ToString();

            var rs2 = str3.Where(a => a.ToString().IndexOf("三")>9).Select(a=>a.ToString());//Linq的Lambda表达式写法

            foreach (var s in rs) //Linq
            {
                Console.WriteLine(s);
            }
            foreach (var s in rs2) //Lambda
            {
                Console.WriteLine(s);
            }

            Console.ReadKey();
        }

        
    }

    /// <summary>
    /// 要学好Linq需要先弄懂啥是匿名类,扩展方法,匿名方法等
    /// 一些平时我们接触很少的东东
    /// 以下是一个创建扩展方法的静态类
    /// 注意:扩展方法只能在静态类中定义且是静态方法
    /// 同时注意:如果扩展方法名与原有方法名冲突,那么扩展方法将失效
    /// 再要注意:扩展方法必须写在顶级类中,不能写在嵌套类中
    /// </summary>
    public static class helper
    {
        public static bool In(this object o, IEnumerable<object> b)
        {
            bool bl = false; ;
            foreach (object obj in b)
            {
                if (obj == o)
                {
                    bl = true;
                    break;
                }
                else
                {
                    bl = false;
                }
            }
            return bl;
        }
    }
    /// <summary>
    /// 自动属性在类中的使用
    /// </summary>
    public class Person
    {
        public string username { get; set; }
        public int age { get; set; }

        public Person()
        {
            this.username = "John";
        }
    }
    /// <summary>
    /// 初始化测试类
    /// </summary>
    public class ObjectInit
    {
        public string name1 { get; set; }

        public override string ToString()
        {
            return string.Format("初始化器测试值是:{0}",this.name1);
        }
    }

    /// <summary>
    /// 使用委托类型测试Lambda表达式
    /// 委托类型以我的理解,就是一个定义方法的类型
    /// 它还可以配合事件驱动来更方便的进行传递数据
    /// 如何窗口程序中的控件的事件都是通过委托来实现的
    /// </summary>
    /// <param name="a"></param>
    /// <param name="b"></param>
    /// <returns></returns>
    public delegate int mydg(int a,int b);

    public static class LambdaTest
    {
        public static int Oper(this int a, int b, mydg dg)//dg这个参数就是一个方法
        {
            return dg(a, b);//方法的返回值是int类型的
        }
    }
}
我说的东东都个人见解,不可全信,各自有各自的理解,如果在下有不正确的地方,还请朋友帮忙纠正。谢过!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值