• ahjesus动态生成表达式树


    直接上方法,看的懂的拿去用,看不懂的找资料看懂

    public PartialViewResult _Product(int pageindex = 1, int pagesize = 12, Double floorprice = 0, Double topprice = 9999999999, string brandstr = "", string categorystr = "", string orderBy = "priceasc") {
                int[] brands;
                if (string.IsNullOrWhiteSpace(brandstr)) {
                    brands = null;
                }
                else {
                    brands = Array.ConvertAll<string, int>(brandstr.Split(','), delegate(string s) { return int.Parse(s); });
                }
                int[] categorys;
                if (string.IsNullOrWhiteSpace(categorystr)) {
                    categorys = null;
                }
                else {
                    categorys = Array.ConvertAll<string, int>(categorystr.Split(','), delegate(string s) { return int.Parse(s); });
                }
                IEnumerable<Product> product;
    
                ParameterExpression paramExpr = Expression.Parameter(typeof(Product), "it");
    
                MemberExpression floorpricePropExpr = Expression.Property(paramExpr, "UnitPrice");
                ConstantExpression floorpriceValueExpr = Expression.Constant(floorprice, typeof(Double));
                BinaryExpression floorpriceExpr = Expression.GreaterThanOrEqual(floorpricePropExpr, floorpriceValueExpr);
                //出自http://www.cnblogs.com/ahjesus 尊重作者辛苦劳动成果,转载请注明出处,谢谢!
                MemberExpression toppricePropExpr = Expression.Property(paramExpr, "UnitPrice");
                ConstantExpression toppriceValueExpr = Expression.Constant(topprice, typeof(Double));
                BinaryExpression toppriceExpr = Expression.LessThanOrEqual(toppricePropExpr, toppriceValueExpr);
    
                Expression whereExpr = Expression.And(floorpriceExpr, toppriceExpr);
                Expression whereBrandExpr = null;
                if (brands != null && brands.Length > 0) {
                    for (int i = 0, j = brands.Length; i < j; i++) {
                        int brand = brands[i];
                        MemberExpression BrandPropExpr = Expression.Property(paramExpr, "Brand");
                        ConstantExpression BrandValueExpr = Expression.Constant(brand, typeof(int));
                        BinaryExpression BrandExpr = Expression.Equal(BrandPropExpr, BrandValueExpr);
                        if (i == 0) {
                            whereBrandExpr = BrandExpr;
                        }
                        else { whereBrandExpr = Expression.Or(whereBrandExpr, BrandExpr); }
    
                    }
                }
    
                Expression wherecategoryExpr = null;
                if (categorys != null && categorys.Length > 0) {
                    for (int i = 0, j = categorys.Length; i < j; i++) {
                        int category = categorys[i];
                        MemberExpression categoryPropExpr = Expression.Property(paramExpr, "Category");
                        ConstantExpression categoryValueExpr = Expression.Constant(category, typeof(int));
                        BinaryExpression categoryExpr = Expression.Equal(categoryPropExpr, categoryValueExpr);
                        if (wherecategoryExpr == null) {
                            if (i == 0) {
                                wherecategoryExpr = categoryExpr;
                            }//出自http://www.cnblogs.com/ahjesus 尊重作者辛苦劳动成果,转载请注明出处,谢谢!
                            else {
                                wherecategoryExpr = Expression.Or(wherecategoryExpr, categoryExpr);
                            }
                        }
                        else {
                            wherecategoryExpr = Expression.Or(wherecategoryExpr, categoryExpr);
                        }
                    }
                }
    
                if (whereBrandExpr != null) {
                    whereExpr = Expression.And(whereExpr, whereBrandExpr);
                }
                if (wherecategoryExpr != null) {
                    whereExpr = Expression.And(whereExpr, wherecategoryExpr);
                }
    
                Expression<Func<Product, bool>> lambda = Expression.Lambda<Func<Product, bool>>(whereExpr, paramExpr);
    
                switch (orderBy) {
                    case "priceasc":
                        product = BLLRequest.Current.ProductCollection.Where(lambda.Compile()).OrderBy(it => it.UnitPrice);
                        break;
                    case "pricedesc":
                        product = BLLRequest.Current.ProductCollection.Where(lambda.Compile()).OrderByDescending(it => it.UnitPrice);
                        break;
                    case "salesasc":
                        product = BLLRequest.Current.ProductCollection.Where(lambda.Compile()).OrderBy(it => it.SalesQty);
                        break;
                    case "salesdesc":
                        product = BLLRequest.Current.ProductCollection.Where(lambda.Compile()).OrderByDescending(it => it.SalesQty);
                        break;
                    default:
                        product = BLLRequest.Current.ProductCollection.Where(lambda.Compile()).OrderBy(it => it.UnitPrice);
                        break;
                }
    
                int total = product.Count();
                int pagecount = (total % pagesize) > 0 ? (total / pagesize) + 1 : (total / pagesize);
                product = product.Skip((pageindex - 1) * pagesize).Take(pagesize);
                ViewBag.product = product;
                ViewBag.total = total;
                ViewBag.pagecount = pagecount;
                ViewBag.pageindex = pageindex;
                return PartialView();
            }


     

  • 相关阅读:
    软件工程第二次作业
    软件工程第一次作业
    软件工程最后一次作业
    软件工程第四次作业
    软件工程第三次作业
    软件工程第二次作业
    软件工程第一次作业
    《算法笔记》2.2小节——C/C++快速入门->顺序结构
    大数阶乘
    printf("%f ",5)的输出结果为什么是0.000000
  • 原文地址:https://www.cnblogs.com/ahjesus/p/3402361.html
Copyright © 2020-2023  润新知