• lambda expressions


    语法
    lambda表达式包含下面几个要素:
    1、逗号分隔的参数列表,如CheckPerson。test(Person p),其中p表示一个Person的对象实例

    2、向右箭头 →, 箭头左侧是表达式入参,箭头右侧是表达式本身
    3、表达式体,包含单个表达式或者一个语句块

    public class SyntaxInstruction {

      public static void main(String[] args) {


    List<Person> persons = PersonGenerator.generatePerons();
      printPerson(persons, p -> p.getAge() > 30 && p.getAge() < 50);
    }

    public static void printPerson(List<Person> persons, CheckPerson cp) {
      for(Person p : persons) {
        if(cp.test(p)) System.out.println(p);
      }
    }
    }

    interface CheckPerson{
      public boolean test(Person p);
    }

    很多时候我们在使用Lambda表达式查询时,比如使用Lambda表达式查询用户数据,有时候会用电话或邮箱去查询用户信息,有时候又会用户名去查询用户信息

        var user = db.Set<U_User>().Where(c => c.UserName = "nee32");
        var user = db.Set<U_User>().Where(c => c.TelePhone = "13888888888");

    其实查询的结果都一样,但唯一的区别就是Lambda表达式中的条件不一样,那么能不能只写一个查询方法,而实现Lambda表达式中Where的有查询条件呢?答案当然是 能!例如在三层架构中使用一个方法满足使用多个条件查询,代码如下

        public class UserDAL
        {
            /// <summary>
            /// 根据条件查找用户列表
            /// </summary>
            /// <param name="where"></param>
            /// <returns></returns>
            public List<U_User> FindAll(System.Linq.Expressions.Func<U_User, bool>> where = null)
            {
                using (EFContext db = new EFContext())
                {
                    if (where == null)
                        return db.U_User.ToList();
                    else
                        return db.U_User.Where(where).ToList();
                }
            }
        }

    声明了一个FindAll方法,参数是可空的Lambda表达式(Expression<Func<U_User, bool>>表示一个Lambda表达式)

    其中Func<U_User, bool>使用泛型委托 传入U_User,返回一个bool值

    方法调用

            public ActionResult Index()
            {
                //List<U_User> userList = userBLL.FindAll(c => c.UserName == "nee32");
                //List<U_User> userList = userBLL.FindAll(c => c.UserName == "nee32" && c.Status == 1);
                List<U_User> userList = userBLL.FindAll();
                return View();
            }

    使用Expression表达式分页,注意 Linq分页之前必须先排序 分页代码如下

        /// <typeparam name="TKey">排序的字段类型</typeparam>
        /// <param name="pageIndex">当前页</param>
        /// <param name="pageSize">每页条数</param>
        /// <param name="orderby">排序字段 Lambda表达式</param>
        /// <param name="where">查询条件 Lambda表达式</param>
        /// <returns></returns>
        public List<U_User> GetPageList<TKey>(int pageIndex, int pageSize, Expression<Func<U_User, TKey>> orderby,Expression<Func<U_User, bool>> where = null)
        {
            using (EFContext db = new EFContext())
            {
                var query = from d in db.U_User select d;
                if (where != null)
                {
                    query = query.Where(where);
                }
                var data = query.OrderBy(orderby)
                .Skip((pageIndex - 1) * pageSize)
                .Take(pageSize)
                .ToList();
    
                return data;
            }
        }

    分页方法调用

        public ActionResult Index()
        {
            List<U_User> userList = userBLL.GetPageList(1, 20, c => c.CreateTime, c => c.UserName == "nee32");
            return View(userList);
        }
  • 相关阅读:
    简简单单制作鼠标静态动态 ani cur 小结 鼠标形状指针
    【VB6 学习文档管理系统源码】
    Delphi 中的全局快捷键+给指定窗体发送按键
    C# 委托实例实现的多种类型
    PyCharm 上传项目到码云托管平台
    vs rdlc 设置Tablix 在新页面重复表头
    .net C# Chart控件的简单使用
    发邮件,阿里云,未指定邮件服务器端口导致的报错
    使用Quartz Job 简单的做一个定时服务
    FromBase64String 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符
  • 原文地址:https://www.cnblogs.com/ting-3/p/10777978.html
Copyright © 2020-2023  润新知