lambda expressions

語法
lambda表達式包含下面幾個要素:
一、逗號分隔的參數列表,如CheckPerson。test(Person p),其中p表示一個Person的對象實例架構

二、向右箭頭 →, 箭頭左側是表達式入參,箭頭右側是表達式自己
三、表達式體,包含單個表達式或者一個語句塊

public class SyntaxInstruction {spa

  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);
}ip

不少時候咱們在使用Lambda表達式查詢時,好比使用Lambda表達式查詢用戶數據,有時候會用電話或郵箱去查詢用戶信息,有時候又會用戶名去查詢用戶信息get

    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的有查詢條件呢?答案固然是 能!例如在三層架構中使用一個方法知足使用多個條件查詢,代碼以下io

    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表達式)class

其中Func<U_User, bool>使用泛型委託 傳入U_User,返回一個bool值test

方法調用泛型

        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);
    }
相關文章
相關標籤/搜索