C#lambda表达式可以这样吗?

CSY_Admin 2020-08-10 05:53:46
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,请问下各位大牛可以这样去实现吗?
...全文
2140 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
无语无 2020-08-11
  • 打赏
  • 举报
回复
我感觉应该没问题
正怒月神 2020-08-11
  • 打赏
  • 举报
回复
我当时是这样写的。
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;
        }
wanghui0380 2020-08-11
  • 打赏
  • 举报
回复
我们并不想讨论这个问题。我们更愿意说,别去折腾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
threenewbee 2020-08-10
  • 打赏
  • 举报
回复
如果编译没有错误的话,我觉得可以。

8,492

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧