很多時候我們在使用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);
}
