EF分頁
public IPage<TEntity> Page<TKey, TEntity>(int pageIndex, int pageSize, Expression<Func<TEntity, bool>> predicate, bool isAsc,
Expression<Func<TEntity, TKey>> keySelector) where TEntity : class
{
using (BaseEntitiesContext context = new BaseEntitiesContext())
{
if (pageIndex <= 0 && pageSize <= 0)
{
throw new Exception("pageIndex或pageSize不能小于等于0!");
}
IPage<TEntity> page = new Page<TEntity>()
{
PageIndex = pageIndex,
PageSize = pageSize
};
int skip = (pageIndex - 1) * pageSize;
if (predicate == null)
{
FutureCount fcount = context.Set<TEntity>().FutureCount();
FutureQuery<TEntity> futureQuery = isAsc
? context.Set<TEntity>().OrderBy(keySelector).Skip(skip).Take(pageSize).Future()
: context.Set<TEntity>().OrderByDescending(keySelector).Skip(skip).Take(pageSize).Future();
page.TotalItems = fcount.Value;
page.Items = futureQuery.ToList();
page.TotalPages = page.TotalItems / pageSize;
if ((page.TotalItems % pageSize) != 0) page.TotalPages++;
}
else
{
var queryable = context.Set<TEntity>().Where(predicate);
FutureCount fcount = queryable.FutureCount();
FutureQuery<TEntity> futureQuery = isAsc
? queryable.OrderBy(keySelector).Skip(skip).Take(pageSize).Future()
: queryable.OrderByDescending(keySelector).Skip(skip).Take(pageSize).Future();
page.TotalItems = fcount.Value;
page.Items = futureQuery.ToList();
page.TotalPages = page.TotalItems / pageSize;
if ((page.TotalItems % pageSize) != 0) page.TotalPages++;
}
return page;
}
}
正常使用
using (BaseEntitiesContext context = new BaseEntitiesContext())
{
var result = context.Page<int?, TBR_Dictionaries>(1, 50, w => w.UPDATER == "00000000-0000-0000-0000-000000000000" , true, w => w.DIC_SORT);
}
入參為前端提供,后端決議成Lamada
比方說上面這個就是通過前端入參
{
pageIndex: 1
pageSize: 50
fliterItems:[{fieldName: "UPDATER", compare: "EQ", value: "00000000-0000-0000-0000-000000000000"}]
sortFiled: DIC_SORT
sortOrder: isAsc
}
決議而成,目前如果這里的 w.UPDATER == "00000000-0000-0000-0000-000000000000"可以寫成 w["UPDATER"] == "00000000-0000-0000-0000-000000000000"這種變數形式,后臺則不用寫出過多的if,else判斷組裝lambda,請問下各位大牛可以這樣去實作嗎?
uj5u.com熱心網友回復:
如果編譯沒有錯誤的話,我覺得可以。uj5u.com熱心網友回復:
我們并不想討論這個問題。我們更愿意說,別去折騰EF。可以去看看GraphQL,看完GraphQL了你會發現他才是你這想法的入口(雖然要實作也要emit,也要iqueryable,也要exspresstion,但是我們的建議是先抬頭看看天,看看路。別總盯著腳底)
https://www.nuget.org/packages/GraphQL/3.0.0-preview-1648
https://www.nuget.org/packages/GraphQL.EntityFramework/11.0.0-beta.4
uj5u.com熱心網友回復:
我當時是這樣寫的。public virtual IQueryable<T> FindPageList<S>(int pageIndex, int pageSize, out int totalRecord, Expression<Func<T, bool>> whereLamdba, bool isAsc, Expression<Func<T, S>> orderLamdba)
{
var _list = dbEF.Set<T>().AsNoTracking().Where<T>(whereLamdba);
totalRecord = _list.Count();
if (isAsc) _list = _list.OrderBy<T, S>(orderLamdba).Skip<T>((pageIndex - 1) * pageSize).Take<T>(pageSize);
else _list = _list.OrderByDescending<T, S>(orderLamdba).Skip<T>((pageIndex - 1) * pageSize).Take<T>(pageSize);
return _list;
}
uj5u.com熱心網友回復:
我感覺應該沒問題轉載請註明出處,本文鏈接:https://www.uj5u.com/net/16205.html
標籤:LINQ
