none
如何调用Func<T, bool> where 参数,做动态拼接查询 RRS feed

  • 问题

  • 有一个 分页方法 如下:
    #region 分页方法
            /// <summary>
            /// 分页
            /// </summary>
            /// <param name="where">条件</param>
            /// <param name="order">排序</param>
            /// <param name="pageIndex">当前页</param>
            /// <param name="pageSize">每页数据量</param>
            /// <param name="count">总数</param>
            /// <returns></returns>
            [NonAction]
            private List<ticket> getPageData(Func<ticket, bool> where, Func<ticket, dynamic> order, int pageIndex, int pageSize, out int count)
            {
                using (phoneTicketEntity db = new phoneTicketEntity())
                {
                    var queryList = where != null ? db.tickets.AsNoTracking().Where(where) : db.tickets.AsNoTracking();
    
                    queryList = order != null ? queryList.OrderByDescending(order) : queryList;
    
                    count = queryList.Count();
    
                    return queryList.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
                }
            }
            #endregion

    //前端调用getJsonData()返回json数据,这个方法调用了上面的分页功能,参数都是需要动态查询的字段,

    //其中拼接了getPageData方法需要的where参数,显然是错误的,只能查询满足一个的条件,如何修改,请指点

            public ActionResult getJsonData(int page = 1, int limit = 10,string username = "", string fpcode = "", string fpnumber = "",
                                            string price_min="",string price_max="", string fpdate = "")
            {
                int count = 0;
    
                Func<ticket, bool> where = t=> t.deptid == ((user)Session["user"]).ID; //只查当前部门
    
                if (!string.IsNullOrEmpty(username))
                    where = t => t.username == username;
    
                if (!string.IsNullOrEmpty(fpcode))
                    where = t => t.fpcode == fpcode;
    
                if (!string.IsNullOrEmpty(fpnumber))
                    where = t => t.fpnumber == fpnumber;
    
                if (!string.IsNullOrEmpty(price_min))
                    where = t => t.fpmoney >= Convert.ToDecimal(price_min);
    
                if (!string.IsNullOrEmpty(price_max))
                    where = t => t.fpmoney <= Convert.ToDecimal(price_max);
    
                if (!string.IsNullOrEmpty(fpdate))
                    where = t => t.fpdate.ToString() == fpdate;
    
    
                //if (!string.IsNullOrEmpty(fpdatestart) && !string.IsNullOrEmpty(fpdateend))
                //    where = t => t.fpdate.AddDays //日期范围内
    
               
                var tickets = getPageData(where,t => t.fpdate, page, limit, out count);
    
                return Json(
                    new JsonFormatResult
                    {
                        Count = count,
                        Code = Code.ok,
                        Msg = "msg.ok",
                        Data = tickets
                    }, JsonRequestBehavior.AllowGet
               );
            }

    2020年11月25日 13:56

全部回复

  • 请问你指的是如何修改getJsonData方法,以便可以支持同时多个字段条件组合在一查询吗?

    <audio controls="controls" style="display:none;"></audio>


    快乐在于能够长时间的为自己认为值得的事情努力工作,不管它是什么。

    2020年11月26日 2:48
  • 谢谢关注,getJsonData 始终是在为 getPageData 准备参数,怎么改都行,最好改getJsonData 
    • 已编辑 icod 2020年11月26日 3:55
    2020年11月26日 3:54
  • 你需要用到表达式树,你可以参考这篇文档。

    https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/expression-trees/

    Func是不能拼接的,表达式树可以,可以一个接着一个,拼在一起,最后生成一个完整的表达式,然后把这个表达式传递给Entire Framework,就能获取到过滤了条件的结果了。


    快乐在于能够长时间的为自己认为值得的事情努力工作,不管它是什么。

    2020年11月26日 3:59