EF查詢 常用IQueryable拓展

2022-07-03 05:18:11 字數 3233 閱讀 5834

背景

日常使用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語句。

需要注意iqueryableienumerablewhere方法的引數不同(expression表示式語句)實際用法是一樣的。

public static iqueryablewhereif(this iqueryablesource, expression> predicate, bool condition)

return source;

}public static ienumerablewhereif(this ienumerablesource, funcpredicate, bool condition)

return source;

}

page語句:簡單封裝下iqueryableienumerable分頁方法,只是精簡了一下而已。

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...