Linq 表达

Lambda 简单了解

      //Lambda 

            //匿名方法
            //delegate (Student s) { return s.Age > 12 && s.Age < 20; };
            //Lable 表达式 (代替了上面的)
            //s => s.Age > 12 && s.Age < 20

            //在Lambda Expression 中指定多个参数
            //(s, youngAge) => s.Age >= youngage;
            //指定参数类型
            //(Student s, int youngAge) => s.Age >= youngage;

            //没有参数的Lambda表达式
            //() => Console.WriteLine("Parameter less lambda expression")

            //多语句Lambda表达式
            //(s, youngAge) =>
            //{
            //    Console.WriteLine("Lambda expression with multiple statements in the body");
            //    Return s.Age >= youngAge;
            //}
View Code

将Lambda表达式分配给委派

lambda表达式可以分配给Func<in T, out TResult>类型委托。Func委托中的最后一个参数类型是返回类型,其余是输入参数。而Action<int T> 类型委托,只有输入参数,不返回。

例如:

  Func<Student, bool> isStudentTeenAger = x => x.Age > 12 && x.Age < 20;
            Student std = new Student { Age = 21 };
            bool isTeen = isStudentTeenAger(std);//false

这个委托我们可以来用方法表示

 bool isStudentTeenAger(Student s)
        {
            return s.Age > 12 && s.Age < 20;
        }

Action:

  Action<Student> PrintStudentDetail = s => Console.WriteLine("Name: {0}, Age: {1} ", s.StudentName, s.Age);
            Student std = new Student() { StudentName = "Bill", Age = 21 };
            PrintStudentDetail(std);//output: Name: Bill, Age: 21

 

Linq中的Func:

  IList<Student> studentList = new List<Student>() {
                new Student { Age=15, StudentName="sealee"  },
                new Student { Age=21, StudentName="sealee2"  },
            };

            Func<Student, bool> isStudentTeenAger = s => s.Age > 12 && s.Age < 20;
            var teenStudents = studentList.Where(isStudentTeenAger).ToList<Student>();

 

LINQ中的表达式

我们已经了解到lambda Expression可以分配给Func或Action类型委托来处理内存中的集合。.NET编译器在编译时将分配给Func或Action类型委托的lambda表达式转换为可执行代码。

LINQ引入了名为Expression的新类型,它表示强类型的lambda表达式。这意味着lambda表达式也可以分配给Expression <TDelegate>类型。.NET编译器将分配给Expression <TDelegate>的lambda表达式转换为表达式树而不是可执行代码。

  //定义表达式
            //Func 方法
           // Func<Student, bool> isTeenAger = s => s.Age > 12 && s.Age < 20;
            //使用Expresson包装Func委托将上述Func类型委托转换为表达式,如下所示:
            Expression<Func<Student, bool>> isTeenAgerExpr = s => s.Age > 12 && s.Age < 20;

            //调用表达式
            Func<Student, bool> isTeenAger = isTeenAgerExpr.Compile();
            //Invoke
            bool result = isTeenAger(new Student() { ID = 1, StudentName = "Steve", Age = 20 });

 

使用:

  //IEnumerable  studentList
            IList<Student> studentList = new List<Student>() {
                new Student { Age=15, StudentName="sealee"  },
                new Student { Age=21, StudentName="sealee2"  },
            };
            Func<Student, bool> isStudentTeenAger = s => s.Age > 12 && s.Age < 20;
            //OutDto  是我们自己定义的返回类    实际情况一般针对我们的返回接口都会生成一个单独的Dto来返回
            Expression<Func<Student, OutDto>> outDto = 
                s => new OutDto { AAgeDto = s.Age, StudentNameDto = s.StudentName };
            var teenStudents = studentList.Where(isStudentTeenAger).AsQueryable().Select(outDto);
            //AsQueryable  注意这里,select(Expression) 需要我们是IQueryable
            //IEnumerable 使用的是 Func
            //IQueryable  使用的是  Expression<Func

 

posted @ 2018-09-30 15:50  Sealee  阅读(227)  评论(0编辑  收藏  举报