背景
日常使用ef查詢資料時,經常會用到篩選(where
),排序(sort
),分頁(skip take
)等操作。
舉個簡單例子
var list = dbcontext.students.where(d => true);//篩選
if (!string.isnullorwhitespace(query.name))
if (!string.isnullorwhitespace(query.remark))
//...
var result = list.orderby(d => d.id)//排序
.skip((query.pageindex - 1) * query.pagesize).take(query.pagesize)//分頁
.tolist();//從資料庫取出資料
//獲取單個實體的name屬性
var student = list.firstordefault(d=>d.name.contains(query.name));
var name = "";
if (student != null)
常常感覺重複性的**過多,占用的篇幅不小,想點辦法解決一下。
解決方案
where語句:封裝whereif
拓展方法,只有當指定的condition
成立時,才執行predicate
語句。
需要注意iqueryable
和ienumerable
的where
方法的引數不同(expression
表示式語句)實際用法是一樣的。
public static iqueryablewhereif(this iqueryablesource, expression> predicate, bool condition)
return source;
}public static ienumerablewhereif(this ienumerablesource, funcpredicate, bool condition)
return source;
}
page
語句:簡單封裝下iqueryable
和ienumerable
分頁方法,只是精簡了一下而已。
public static iqueryabledatapage(this iqueryablesource, int pagenumber, int pagesize)
return source.take(pagesize);
}else
}
sort
語句:通過拼接sort排序字串 這裡需要引入乙個system.linq.dynamic.core
,支援查詢字串拼接,進行動態查詢。
public static iqueryabledatasort(this iqueryablesource, string sortexpression)
, stringsplitoptions.removeemptyentries);
var defaultorder = "desc";
if (sortstrs.length == 2)
if (typeof(t).getproperty("id") != null && sortstrs[0] != "id")
else
return source;
}catch (exception)
}
組合一下來個datalist
public static iqueryabledatalist(this iqueryablesource, int page = 1, int rows = int.maxvalue, string sort = "id", string order = "desc")
獲取單個物件的語句prodefault
/// /// 獲取乙個物件的屬性,物件如果為空,則返回屬性的預設值
///
/// 物件型別
/// 返回值型別
/// 需要判空的物件
/// 執行函式
/// 預設值
///
public static t prodefault(this tsource entity, funcfunc, t t = default(t)) where tsource : class
return t;
}
對照文章最開始的例子,用上這些封裝後的方法試試。
list = list.whereif(d => d.name.contains(query.name), !string.isnullorwhitespace(query.name));
list = list.whereif(d => d.remark.contains(query.remark), !string.isnullorwhitespace(query.remark));
var result = list.datalist(query.pageindex, query.pagesize).tolist();
var name = list.firstordefault().prodefault(d => d.name, "");
總結
本文簡單介紹一下個人日常開發過程中常用的一些封裝方法。那麼有沒有可能再簡單一點,連這些方法都不需要寫了呢?只要傳入乙個query
物件就可以直接得到結果呢?
答案當然是可以的,這裡就簡單介紹下思路,具體的實現方式就留著以後再說了~
通過反射獲取查詢物件中的資料,拼接查詢字串,借助system.linq.dynamic.core
外掛程式的拓展方法,進行資料查詢。
深究其原理,最終還是將查詢字串,處理為相應的表示式樹expression
。那麼,我們是不是也可以自己來拼接表示式樹呢~ EF 分頁查詢
使用lambda表示式 建立上下文 datamodelcontainer dbcontext new datamodelcontainer 每頁5條資料,取第3頁的資料 var data dbcontext.userinfo where u u.id 1 orderby u u.id skip 5 ...
ef 查詢語法
1 無引數查詢 varmodel db.database.sqlquery select from userinfoes tolist 2 有參查詢 varmodel db.database.sqlquery select from userinfoes where id id newsqlpara...
EF隨機查詢詳解
有一些業務上並不要求查詢出全部資料,而是隨機取出幾條資料,應用場景如下 我要從一群人當中選擇1個人獲得獎金,為了保證每個人的公平性,必須採用隨機演算法 sql語法中,我們可以這樣寫 select top 1 from t order by newid c 當中,可以用random類來獲取隨機數 ef...